如何为 SELECT 查询的每个结果插入三个新行到同一个表中

Posted

技术标签:

【中文标题】如何为 SELECT 查询的每个结果插入三个新行到同一个表中【英文标题】:How to insert three new rows for every result of a SELECT query into the same table 【发布时间】:2016-02-16 03:20:23 【问题描述】:

我正在使用 SQL Server。 对于每个:

select * from ServiceItems where Itemtypeid=7004 (query1)

我想在同一个表中插入三个新行,例如:

(ItemID, PackageID, ItemTypeID, ServiceID, ItemName, CreatedDate) VALUES
(19377, 5352, 7007, 2011, N'L1', '11/11/2015 6:50:51 PM'), 
(19378, 5352, 7008, 2011, N'M1', '11/11/2015 6:50:51 PM'), 
(19376, 5352, 7006, 2011, N'W1', '11/11/2015 6:50:51 PM') 

ItemID = is the primary key
PackageID = one from query1
ItemTypeID = as it is 7006,7007,700
ServiceID = one from query1
ItemName =  as it is L1,M1,W1
CreatedDate = time now

我试过INSERT INTO SELECT...

INSERT INTO ServiceItems (PackageID, ItemTypeID, ServiceID, ItemName, CreatedDate)
SELECT PackageID, '7006', ServiceID, 'W1','' FROM ServiceItems WHERE ItemID = '7004'

但是这个会增加一行。我必须创建三个单独的查询吗?使用游标怎么样?

【问题讨论】:

您如何确定每次插入时插入的行的值? @Kritner 有些值与结果值相同,有些是手动添加的(日期和名称)。 【参考方案1】:

你可以使用UNION ALL:

INSERT INTO ServiceItems (PackageID, ItemTypeID, ServiceID, ItemName, CreatedDate)

SELECT PackageID, '7006', ServiceID, 'W1', current_timestamp 
FROM ServiceItems 
WHERE ItemID = '7004'

UNION ALL

SELECT PackageID, '7007', ServiceID, 'L1', current_timestamp 
FROM ServiceItems 
WHERE ItemID = '7004'

UNION ALL

SELECT PackageID, '7008', ServiceID, 'M1', current_timestamp 
FROM ServiceItems 
WHERE ItemID = '7004'

或者更好,CROSS JOIN:

INSERT INTO ServiceItems (PackageID, ItemTypeID, ServiceID, ItemName, CreatedDate)
SELECT s.PackageID, x.ItemTypeId, s.ServiceID, x.ItemName, current_timestamp
FROM ServiceItems AS s 
CROSS JOIN (
  VALUES ('7006', 'W1'), 
         ('7007', 'L1'), 
         ('7008', 'M1')
) AS x (ItemTypeId, ItemName)
WHERE s.ItemID = '7004'

【讨论】:

好的。让我试一试。 我将使用这个脚本作为生产数据库的迁移。这对我来说是最好的解决方案吗? @GiannisGrivas:这是我能想到的最好的了,尤其是CROSS JOIN 变体...... 性能怎么样? ***.com/questions/905379/… 表明 UNION 更快,不是吗? @GiannisGrivas 。 . .我在那个问题中看不到任何东西表明一个比另一个快。在这种情况下,我希望 cross join 在大型结果集上具有更好的性能,但除非 ServiceItems 表不适合内存,否则您真的看不到差异。

以上是关于如何为 SELECT 查询的每个结果插入三个新行到同一个表中的主要内容,如果未能解决你的问题,请参考以下文章

如何为过去 3 个月的每个日期运行查询

如何用SQL代码将动态查询结果赋值给变量?

想把select查询的结果作为insert的值插入数据表

插入数据

插入数据

Zend 2 - 教义如何为三个实体插入一对多?