是否有快捷方式删除一个表中的所有表而不是另一个表?

时间:2017-03-09 20:29:04

标签: tsql ssms-2014

是否有任何快捷方式可以删除一个表中第二个不存在的所有内容?

我知道我可以这样做:

    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在处理我正在研究的这个项目时非常方便,但我猜它是有限的。

3 个答案:

答案 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])
);