如何使用来自同一个表中超过 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吗?的主要内容,如果未能解决你的问题,请参考以下文章
SQL SSMS CREATE TABLE 使用来自另一列的值