如何从一个表列中获取值,将它们与字符串连接并将它们插入另一个表中?

Posted

技术标签:

【中文标题】如何从一个表列中获取值,将它们与字符串连接并将它们插入另一个表中?【英文标题】:How to get values from one table column, concatenate them with a string and insert them in another table? 【发布时间】:2015-04-06 08:27:09 【问题描述】:

如何:

    从 table1.column1 中获取值(例如 abc)

    table1.column1=abc

    将它们与某些固定字符串连接,例如

    xxx yyy zzz

    将结果作为单独的行插入到 table2.column2 中。最终结果应该是具有如下值的行:

    table2.column2=abc_xxx table2.column2=abc_yyy table2.column2=abc_zzz

(table2 有一个连接列指示 table2.column2 记录对应于哪个 ID,以防万一)

    table1.column1table1.item_id > 100 的所有记录重复此过程

编辑:为方便起见,我希望最终结果行序列看起来像:

source1_xxx source1_yyy source1_zzz source2_xxx source2_yyy source2_zzz

不喜欢:

source1_xxx source2_xxx source1_yyy source2_yyy source1_zzz source2_zzz

【问题讨论】:

您无法在一个查询中执行此操作。您要么需要在服务器端执行多个查询,要么使用事务。 可以使用多个查询。我只是不知道该怎么做。 什么是服务器端语言? 服务器是Percona (mysql)。 【参考方案1】:

如果我理解正确,您希望表 1 中的每个现有行都有 N 个(例如 3 个)条目。如果是这样,您可以 CROSS JOIN Table1 到值的投影,如下所示:

INSERT INTO Table2(column2)
    SELECT CONCAT(t1.column1, '_', x.col)
    FROM Table1 t1
    CROSS JOIN 
    (SELECT 'xxx' AS col
     UNION
     SELECT 'yyy'
     UNION 
     SELECT 'zzz') x;

SqlFiddle here

编辑

查询已更新,以了解排序和过滤要求:

INSERT INTO Table2(column2)
    SELECT CONCAT(t1.column1, '_', x.col)
    FROM Table1 t1
    CROSS JOIN 
    (SELECT 'xxx' AS col
     UNION
     SELECT 'yyy'
     UNION 
     SELECT 'zzz') x
    WHERE t1.ID > 100
    ORDER BY t1.column1 ASC, x.col ASC;

With an updated SqlFiddle

【讨论】:

谢谢斯图尔特。你也可以看看编辑吗?我尝试了您的建议,但似乎给出了另一个序列,而不是我需要的序列:link MySql 允许您在插入期间按顺序排序,使用时将正确排序,例如带有 AUTO_INCREMENT 列。这个updated fiddle help? 这看起来更好:) 在服务器上尝试之前 - 你能告诉我如何修改它以便它只影响 table1.item_id>100? IE。我在哪里放置'where'条件。谢谢! WHEREFROM 之后和ORDER BY 之前。另一个Updated Fiddle 太棒了。请让我在服务器上尝试一下,我会回来确认这是答案:)【参考方案2】:

修改答案。

归功于 StuartLC ..他是对的,你需要使用交叉连接

INSERT INTO Table2(column2)
SELECT CONCAT(t1.column1, '_', x.col)
FROM Table1 t1
CROSS JOIN 
(SELECT 'xxx' AS col
 UNION
 SELECT 'yyy'
 UNION 
 SELECT 'zzz') x;

【讨论】:

我想这会在 table2 中创建一个行序列,例如:source1_xxx source2_xxx source1_yyy source2_yyy source1_zzz source2_zzz 为了方便起见,我希望行值像这样排序:source1_xxx source1_yyy source1_zzz source2_xxx source2_yyy source2_zzz 这可能吗?【参考方案3】:

这是你想要的吗

 insert into table2(column2)
 select concat(col1,'_','xxx') from table1
 union

 select concat(1col1,'_','yyy') from table1

union 

 select concat(col1,'_','zzz') from table1

否则将整个选择语句保留在视图中并在插入语句中使用它

create view abc 
as
 select concat(col1,'_','xxx') from table1
     union

     select concat(1col1,'_','yyy') from table1

    union 

     select concat(col1,'_','zzz') from table1

然后

  insert into table2(column2) select * from abc

【讨论】:

这不适用于 MySQL。你需要INSERT INTO...VALUES (1,2,3)(4,5,6)(7,8,9)

以上是关于如何从一个表列中获取值,将它们与字符串连接并将它们插入另一个表中?的主要内容,如果未能解决你的问题,请参考以下文章

Sql 从一个表列中选择一个最小值,并在一个 SQL 语句中将结果插入到另一个表列中

如何从表列中获取xml值

如何从多选下拉菜单中获取值并将它们与 POST 一起发送?

Pandas - 如何将属性保存到数组中并将它们的值保存到新列中

Pyspark:将数据帧作为 JSON 存储在 MySQL 表列中

从 in[] 数组中获取元素并将它们连接起来的算法[关闭]