是否有删除所有内容的快捷方式 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])
);
是否有任何快捷方式可以删除第二个 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])
);