Sql-Server-2008

從表 A 中刪除記錄,其中 col 1 和 col2 在表 B 中

  • November 6, 2020

如果此表中的多個列在另一個表中,我想從表中刪除記錄。

目前,我通常只是連接列並使用 WHERE IN 方法:

DELETE FROM TableA
WHERE Col1+Col2 IN (SELECT Col1+Col2 FROM TableB)

有沒有更好的方法來達到相同的結果?

謝謝。

通常,您希望將兩個表連接在一起,並從 TableA 中刪除與 TableB 中的行匹配的行。像這樣的東西:

DELETE a
FROM TableA a
   INNER JOIN TableB b ON a.Col1 = b.Col1
       AND a.Col2 = b.Col2;

使用您在問題中顯示的方法可能會導致錯誤的行被刪除。這是一個例子來說明我的意思:

IF OBJECT_ID(N'tempdb..#TableA', N'U') IS NOT NULL
BEGIN
   DROP TABLE #TableA;
END
IF OBJECT_ID(N'tempdb..#TableB', N'U') IS NOT NULL
BEGIN
   DROP TABLE #TableB;
END

CREATE TABLE #TableA
(
   i varchar(5) NOT NULL
   , j varchar(5) NOT NULL
);

CREATE TABLE #TableB
(
   i varchar(5) NOT NULL
   , j varchar(5) NOT NULL
);

INSERT INTO #TableA (i, j)
VALUES ('asdf', 'lk')
   , ('asd', 'flk');

INSERT INTO #TableB (i, j)
VALUES ('as', 'dflk')
   , ('asd', 'flk');

首先,我們將查看兩個表中的值:

SELECT *
FROM #TableA;

SELECT *
FROM #TableB;
╔══════╦═════╗
║ 我 ║ j ║
╠══════╬═════╣
║ asdf ║ lk ║
║ asd ║ flk ║
╚══════╩═════╝

╔═════╦══════╗
║ 我 ║ j ║
╠═════╬══════╣
║ ║ dflk ║
║ asd ║ flk ║
╚═════╩══════╝

目的是刪除 TableA 中的底行,同時保留頂行。但是,如果我們執行這個:

DELETE FROM #TableA
WHERE #TableA.i + #TableA.j IN (SELECT #TableB.i + #TableB.j FROM #TableB);

SELECT *
FROM #TableA;

我們將看到兩行都從 TableA 中消失了。

但是,此語句只會從 TableA 中刪除正確的行:

DELETE a
FROM #TableA a
   INNER JOIN #TableB b ON a.i = b.i
       AND a.j = b.j;
SELECT *
FROM #TableA;

結果:

╔══════╦════╗
║ 我 ║ j ║
╠══════╬════╣
║ asdf ║ lk ║
╚══════╩════╝

引用自:https://dba.stackexchange.com/questions/279318