SQL Server:如果不存在多个
问题描述:
我需要将多行插入到表中。我通过选择另一个表中的行并将它们插入到所需的表中来完成此操作。SQL Server:如果不存在多个
问题是我需要插入的一行或两行可能已经存在。如何在插入许多行的插入上执行IF NOT EXISTS
,如下例所示:
BEGIN TRAN
INSERT INTO [main].[dbo].[product_usa]
SELECT *
FROM [main].[dbo].[product_mxo]
WHERE tag_key IN ('15652', '16161', '11431', '16214', '16215', '16216',
'16213', '16217', '16218', '16222')
AND edition_key = '1'
AND product_key = '1'
-- COMMIT
-- ROLLBACK
答
如果tag_key
是PK中都product_usa
和product_mxo
只需要添加exists
验证tag_key已不存在。
INSERT INTO [main].[dbo].[product_usa]
SELECT *
FROM [main].[dbo].[product_mxo] mxo
WHERE tag_key IN
('15652', '16161', '11431',
'16214', '16215', '16216',
'16213', '16217', '16218',
'16222')
AND edition_key = '1'
AND product_key = '1'
AND NOT EXISTS (SELECT 1
FROM [main].[dbo].[product_usa] usa
WHERE us.tag_key = mxo.tag_key)
答
您可以像这样添加EXISTS
。
BEGIN TRAN
INSERT INTO [main].[dbo].[product_usa]
SELECT *
FROM [main].[dbo].[product_mxo]
WHERE tag_key IN
(
'15652',
'16161',
'11431',
'16214',
'16215',
'16216',
'16213',
'16217',
'16218',
'16222'
) AND edition_key = '1' AND product_key = '1'
AND NOT EXISTS(SELECT * FROM [main].[dbo].[product_usa] WHERE /* Column Comparison */)
答
假设tag_key是你可以做这样的事情的主要或唯一键:
INSERT INTO [main].[dbo].[product_usa]
SELECT *
FROM [main].[dbo].[product_mxo] t
WHERE tag_key IN
(
'15652',
'16161',
'11431',
'16214',
'16215',
'16216',
'16213',
'16217',
'16218',
'16222'
) AND edition_key = '1' AND product_key = '1'
AND NOT EXISTS (SELECT 1 FROM [main].[dbo].[product_usa] x WHERE t.tag_key = x.tag_key)
如果你想不存在的只是摆脱你的其他地方条件的所有记录
INSERT INTO [main].[dbo].[product_usa]
SELECT *
FROM [main].[dbo].[product_mxo] t
WHERE
NOT EXISTS (SELECT 1 FROM [main].[dbo].[product_usa] x WHERE t.tag_key = x.tag_key)
答
用tag_key上的目标表执行左外连接并检查是否为空。
INSERT INTO [main].[dbo].[product_usa]
SELECT m.*
FROM [main].[dbo].[product_mxo] m
LEFT OUTER JOIN [main].[dbo].[product_usa] u
ON u.tag_key = m.tag_key
WHERE m.tag_key IN
(
'15652',
'16161',
'11431',
'16214',
'16215',
'16216',
'16213',
'16217',
'16218',
'16222'
) AND m.edition_key = '1' AND m.product_key = '1' AND u.tag_key IS NULL
+0
对不起......你问关于不存在。虽然我的回答将解决您所描述的问题,但它并未使用您询问的工具。我的错... – SQLCliff
0行受到影响。我不知道如何扩大这一点,但有一些行应该受到影响。 – John
查询看起来没问题。试试'SELECT * FROM [main]。[dbo]。[product_usa] usa WHERE tag_key IN ('15652','16161','11431', '16214','16215','16216', '16213 ','16217','16218', '16222')'带来什么结果?然后用'mxo'做同样的工作 –
这两个表的选择都正常工作 – John