【问题标题】: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
【问题描述】:

如何:

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

    table1.column1=abc

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

    xxx yyy zzz

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

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

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

  1. 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)。

标签: mysql sql percona


【解决方案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)
猜你喜欢
  • 2022-06-13
  • 2018-04-20
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多