是否有任何快捷方式可以删除一个表中第二个不存在的所有内容?
我知道我可以这样做:
DECLARE @Table1 TABLE (ID INT)
DECLARE @Table2 TABLE (ID INT)
INSERT INTO @Table1 VALUES (1),(2),(3),(4)
INSERT INTO @Table2 VALUES (3),(4)
DELETE t1
FROM @Table1 t1
WHERE NOT EXISTS (SELECT 1 FROM @Table2 t2 WHERE t2.ID = t1.ID)
SELECT * FROM @Table1
然而,我有超过600列,所以你可以看到为什么我可能不愿意走这条路线,如果有另一种方式。我想做的事情看起来像这样:
DECLARE @Table1 TABLE (ID INT)
DECLARE @Table2 TABLE (ID INT)
INSERT INTO @Table1 VALUES (1),(2),(3),(4)
INSERT INTO @Table2 VALUES (3),(4)
DELETE @Table1
EXCEPT SELECT * FROM @Table2
EXCEPT在处理我正在研究的这个项目时非常方便,但我猜它是有限的。
答案 0 :(得分:2)
请使用此:
DELETE FROM @Table1 WHERE BINARY_CHECKSUM(*) NOT IN(SELECT BINARY_CHECKSUM(*) FROM @Table2);
但请注意,如果您的表包含 float 数据类型。在极少数情况下,可以计算错误的校验和。但是,这些情况很少且随机,在第二次删除迭代后不会出现任何问题。
答案 1 :(得分:0)
不确定
DELETE t1
FROM @Table1 t1
LEFT JOIN @Table2 t2 ON t2.ID = t1.ID
WHERE t2.ID IS NULL
答案 2 :(得分:0)
我的第一个答案是关于这种情况,当t1和t2表是相同的,并且在决定删除时加入了corressponding cols。
好的,现在关于另一种情况:你的@ table1列[ID]可以加入任何未知的@ table2列。您可以使用XML解决600多个cols问题:
DELETE FROM @Table1 WHERE CONVERT(NVARCHAR, [ID]) NOT IN
(
SELECT
[col].[value]('(.)[1]', 'NVARCHAR(MAX)')
FROM
(
SELECT [xml] = (CONVERT(XML, (SELECT * FROM @Table2 FOR XML PATH('t2'))))
) AS [t2]
CROSS APPLY [t2].[xml].[nodes]('t2/*') AS [tab]([col])
);