如何使用来自同一个表中超过 100 列的多个列的值插入行?可以使用LOOP吗?

Posted

技术标签:

【中文标题】如何使用来自同一个表中超过 100 列的多个列的值插入行?可以使用LOOP吗?【英文标题】:How to insert rows using values from mulitple columns in the same table where there are over 100 columns? Possible use LOOP? 【发布时间】:2014-11-07 15:23:41 【问题描述】:

在此处输入代码

假设我有下表:

ID 名称 ID2 ID3 ID4 ID100
1 史密斯 2 3 4 100
20 乔 10 20 30 200
30 简 40 50 60 300

我如何编写一个语句,一次通过 ID2 - ID100 列,并从列和名称列中获取值并将新行添加到表中?

看起来像这样:

ID 名称 ID2 ID3 ID4 ID100
1 史密斯 2 3 4 100
2 史密斯
3 史密斯
4 史密斯
100史密斯

我已经这样做了,但确实想写 100 行选择。

插入到 mytable (身份证,姓名) SELECT ID2, Name FROM mytable WHERE Name = 'Smith' 联合所有 SELECT ID3, Name FROM mytable WHERE Name = 'Smith' 联合所有 SELECT ID4, Name FROM mytable WHERE Name = 'Smith';

【问题讨论】:

你为什么要设计这个烂摊子?创建另一个通过外键引用该表并包含这些值的表。 看起来很像这 100 列应该是子表中的行,父表有 FK。也许这个观察在这一点上没有帮助,但它可能对你的下一个数据库设计有用。 使用 Excel 中的公式编写行。然后将它们复制到您的 SQL 界面中。 这是 sql server 还是 mysql 【参考方案1】:

您的数据库通过创建重复组违反了第一范式。 RDBMS 的设计不是为了干净利落地处理这种设计。这正是您不想创建重复组的原因。除了重新设计之外的任何解决方案都将是丑陋而缓慢的。

如果无法重新设计,答案是做一次痛苦的部分,然后不需要再做一次。

创建以下视图:

CREATE VIEW MyUglyTable_Unpivot (ID, Name, Field_ID, Field_Value) AS
SELECT ID, Name, 'ID2',   ID2   FROM MyTable WHERE ID2   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID3',   ID3   FROM MyTable WHERE ID3   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID4',   ID4   FROM MyTable WHERE ID4   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID5',   ID5   FROM MyTable WHERE ID5   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID6',   ID6   FROM MyTable WHERE ID6   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID7',   ID7   FROM MyTable WHERE ID7   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID8',   ID8   FROM MyTable WHERE ID8   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID9',   ID9   FROM MyTable WHERE ID9   IS NOT NULL UNION ALL
...
SELECT ID, Name, 'ID99',  ID99  FROM MyTable WHERE ID99  IS NOT NULL UNION ALL
SELECT ID, Name, 'ID100', ID100 FROM MyTable WHERE ID100 IS NOT NULL

显然,您可以为视图和字段选择更合理的名称。如果基础表在这些字段上有NOT NULL 约束,您可以省略WHERE XXXX IS NOT NULL,但根据我的经验,它们没有。如果您知道确实需要明确的 NULL 值,也可以将其省略,但这通常被认为是糟糕的设计。 NULL 太模棱两可了。

视图会慢得要命,但它会让你更轻松地进行这样的操作。如果您能够重新设计系统以不使用重复组,我强烈建议您这样做。

现在你可以这样做了:

INSERT INTO MyTable (ID, Name)
SELECT Field_Value, Name FROM MyUglyTable_Unpivot
WHERE Name = 'Smith'

不过,我认为您需要在 MyTable 中添加 Field_ID 才能理解这一切。

【讨论】:

【参考方案2】:

如果你使用外键概念是可能的,否则使用 excel 来编写那些选择

【讨论】:

以上是关于如何使用来自同一个表中超过 100 列的多个列的值插入行?可以使用LOOP吗?的主要内容,如果未能解决你的问题,请参考以下文章

count(*) 来自 2 个具有相同列的表

如何根据来自不同列的多个值过滤熊猫表? [复制]

SQL SSMS CREATE TABLE 使用来自另一列的值

PostgreSQL 查询帮助:如何检查多个列的值是不是同时增加/减少

在oracle中显示来自多个表的某些列的数据不起作用

如何检索表的值以获取sql中两列的最大值