Sql-Server-2008
從表 A 中刪除記錄,其中 col 1 和 col2 在表 B 中
如果此表中的多個列在另一個表中,我想從表中刪除記錄。
目前,我通常只是連接列並使用 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 ║ ╚══════╩════╝