2010-06-04 83 views

回答

60

你可以使用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?

+0

偉大的作品,感謝 – 2010-06-04 11:28:20

+0

好文章!非常感謝.. – Li3ro 2015-01-02 20:57:44

1
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); 
+1

除非是不是在SQL Server 2000中 – 2010-06-04 11:24:15

21

關於第一個問題有至少有三種常用方法可供選擇:

  • NOT EXISTS
  • NOT IN
  • LEFT JOIN

的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的最佳途徑。

-1
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) 
+0

該語法是否有效?它不應該是ID不在(...)的地方嗎? – Behrang 2010-06-04 11:22:35

+0

這不起作用。正確的語法應該是:'SELECT ID FROM WHERE ID ID NOT IN(SELECT ID FROM B);' – kamasheto 2010-06-04 11:23:33

3

這會在你的情況下,選擇4

SELECT ID FROM TableA WHERE ID NOT IN (SELECT ID FROM TableB) 

這將刪除這些

DELETE FROM TableA WHERE ID NOT IN (SELECT ID FROM TableB) 
+1

EXCEPT不是SQL Server 2000的一部分。 – 2010-06-04 11:29:31

0
SELECT ID 
    FROM A 
WHERE NOT EXISTS(SELECT 1 
        FROM B 
        WHERE B.ID = A.ID 
       ) 
相關問題