【问题标题】:Copy only specific rows from one table to another and create a new row for each row information仅将特定行从一个表复制到另一个表并为每行信息创建一个新行
【发布时间】:2014-07-03 15:59:20
【问题描述】:

我只想将特定行从一个表复制到另一个表。到目前为止一切顺利:

CREATE TEMPORARY TABLE tmptable_1 SELECT * FROM HDG.HDG_FINAL_TABLE WHERE HDG.HDG_FINAL_TABLE.FARBFAMILIE LIKE "%,%";
UPDATE tmptable_1 SET primarykey = NULL;
INSERT INTO HDG.HDG_FINAL_TABLE_2 SELECT * FROM tmptable_1;
DROP TEMPORARY TABLE IF EXISTS tmptable_1;

我的问题是“FARBFAMILIE”列有三个不同的值,例如“黑色、蓝色、黄色”。我想复制“FARBFAMILIE”列包含“,”的每一行,并重复该行,因为该列包含用“,”分隔的不同信息。

原行:

第 0 列 - 第 1 列 - 第 2 列

组 - SKU - 颜色

1 - 001 - 黑、蓝、黄

目标:

第 0 列 - 第 1 列 - 第 2 列

组 - SKU - 颜色

1 - 001 - 黑色

1 - 001 - 蓝色

1 - 001 - 黄色

感谢您的帮助!

【问题讨论】:

  • 尝试谷歌搜索“MySQL 拆分函数”

标签: mysql sql


【解决方案1】:

听起来你想做一件崇高的事情,摆脱逗号分隔的列。这并不容易,但你可以做到。首先,您需要知道列中值的最大数量:

select 1 + max(length(FARBFAMILIE) - length(replace(FARBFAMILIE), ',', ''))
from HDG.HDG_FINAL_TABLE;

注意这里计算元素的技巧。取值的长度,减去不带逗号的长度。

然后,你可以得到你想要的行:

select `group`, sku,
       substring_index(substring_index(color, ',', n.n), ',', -1) as color
from HDG.HDG_FINAL_TABLE join
     (select 1 as n union all select 2 union all select 3 . . .
     ) n
     on length(FARBFAMILIE) - length(replace(FARBFAMILIE), ',', '') <= n.n;

这将生成每行具有单独颜色的输出行。

【讨论】:

  • 太棒了!非常感谢你!效果很好
  • 戈登最后一个问题:(a)“,”之前的第一个值总是丢失(例如“黑色”),不知道为什么和(b)我想将代码应用于几列逐步(15列),因此“FARBFAMILIE”列包含3种颜色或更少/更多。如何保持“(select 1 as n union all select 2 union all select 3)”动态?
  • (a) 尝试使用', ' 而不是',' 作为子字符串索引。也许那是在扔东西。 (b) 如果你有一个数字表会有所帮助,但有些技巧太长了,无法评论。
  • 感谢您的帮助。 (a) 我添加了 3 个空格,1 个在子字符串中,2 个在长度语句中。 (b) 我刚刚添加了 12 个选择(一列中的最大信息为 12),所以我有很多重复项,但之后将它们删除。尽管如此,我还有最后一个问题...... :) 整个查询打开 2 个窗口,一个带有属性数量,第二个显示数据。如何将数据保存在另一个表中?我知道如何保存它,但 mysql 说“列数不匹配”,我认为那是因为 1 个窗口(属性数)。我只想保存第二个窗口
  • @user3802349 。 . .新问题应该作为问题提出,而不是在 cmets 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 2012-11-24
  • 2022-11-16
  • 2012-06-09
  • 1970-01-01
相关资源
最近更新 更多