我有兩個表選擇一個值,其中它不與另一個表中存在
表A:
ID
1
2
3
4
表B:
ID
1
2
3
我有兩個請求:
- 我想選擇表A中表B中沒有的所有行ve,在這種情況下是第4行。
- 我想刪除表B沒有的所有行。
我使用SQL Server 2000中
我有兩個表選擇一個值,其中它不與另一個表中存在
表A:
ID
1
2
3
4
表B:
ID
1
2
3
我有兩個請求:
我使用SQL Server 2000中
你可以使用NOT IN
:
SELECT A.* FROM A WHERE ID NOT IN(SELECT ID FROM B)
然而,與此同時,我更喜歡NOT EXISTS
:
SELECT A.* FROM A WHERE NOT EXISTS(SELECT 1 FROM B WHERE B.ID=A.ID)
還有其他的選擇,以及,這篇文章解釋了所有的優點和缺點非常好:
Should I use NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT, or NOT EXISTS?
select ID from A where ID not in (select ID from B);
或
select ID from A except select ID from B;
你的第二個問題:
delete from A where ID not in (select ID from B);
除非是不是在SQL Server 2000中 – 2010-06-04 11:24:15
關於第一個問題有至少有三種常用方法可供選擇:
的SQL是這樣的:
SELECT * FROM TableA WHERE NOT EXISTS (
SELECT NULL
FROM TableB
WHERE TableB.ID = TableA.ID
)
SELECT * FROM TableA WHERE ID NOT IN (
SELECT ID FROM TableB
)
SELECT TableA.* FROM TableA
LEFT JOIN TableB
ON TableA.ID = TableB.ID
WHERE TableB.ID IS NULL
根據您所使用的數據庫,每一個的性能可以有所不同。對於SQL Server(不可爲空列):
NOT EXISTS和NOT IN謂詞是尋找失蹤的價值觀,只要有問題都列是NOT NULL的最佳途徑。
SELECT ID
FROM A
WHERE ID NOT IN (
SELECT ID
FROM B);
SELECT ID
FROM A a
WHERE NOT EXISTS (
SELECT 1
FROM B b
WHERE b.ID = a.ID)
SELECT a.ID
FROM A a
LEFT OUTER JOIN B b
ON a.ID = b.ID
WHERE b.ID IS NULL
DELETE
FROM A
WHERE ID NOT IN (
SELECT ID
FROM B)
這會在你的情況下,選擇4
SELECT ID FROM TableA WHERE ID NOT IN (SELECT ID FROM TableB)
這將刪除這些
DELETE FROM TableA WHERE ID NOT IN (SELECT ID FROM TableB)
EXCEPT不是SQL Server 2000的一部分。 – 2010-06-04 11:29:31
SELECT ID
FROM A
WHERE NOT EXISTS(SELECT 1
FROM B
WHERE B.ID = A.ID
)
偉大的作品,感謝 – 2010-06-04 11:28:20
好文章!非常感謝.. – Li3ro 2015-01-02 20:57:44