是否有删除所有内容的快捷方式 table 而不是另一个?

Is there a shortcut to deleting all in one table not in another?

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

我知道我能做到:

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

请使用这个:

DELETE FROM @Table1 WHERE  BINARY_CHECKSUM(*) NOT IN(SELECT BINARY_CHECKSUM(*) FROM @Table2);

但是要小心,如果您的 table 包含 float 数据类型。在极少数情况下,可能会计算出错误的校验和。但是,这些情况是罕见且随机的,第二次删除迭代后不会留下任何问题。

当然可以:

DELETE t1
FROM @Table1 t1
LEFT JOIN @Table2 t2 ON t2.ID = t1.ID
WHERE t2.ID IS NULL

我的第一个回答是这样的情况,当t1和t2表是一样的,并且加入了对应的cols,决定删除的时候。

好的,现在谈谈另一种情况:您的@table1 列[ID] 可以与任何未知的@table2 列连接。您可以使用 XML:

解决 600 多列问题
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])
);