2010-06-04 58 views

Trả lời

60

Bạn có thể sử dụng NOT IN:

SELECT A.* FROM A WHERE ID NOT IN(SELECT ID FROM B) 

Tuy nhiên, trong khi đó tôi thích NOT EXISTS:

SELECT A.* FROM A WHERE NOT EXISTS(SELECT 1 FROM B WHERE B.ID=A.ID) 

Có những lựa chọn khác nữa, bài viết này giải thích tất cả những ưu điểm và nhược điểm rất tốt:

Should I use NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT, or NOT EXISTS?

+0

Các công trình lớn, nhờ –

+0

bài viết tốt đẹp! cảm ơn rất nhiều .. – Li3ro

1
select ID from A where ID not in (select ID from B); 

hoặc

select ID from A except select ID from B; 

câu hỏi thứ hai của bạn:

delete from A where ID not in (select ID from B); 
+1

Trừ không có trong SQL Server 2000. –

21

Đối với câu hỏi đầu tiên của bạn có có ít nhất ba phương pháp phổ biến để lựa chọn:

  • NOT EXISTS
  • NOT IN
  • LEFT JOIN

SQL trông như thế này:

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 

Tùy thuộc vào cơ sở dữ liệu bạn đang sử dụng, hiệu suất của mỗi thể khác nhau. Đối với SQL Server (không phải cột trống):

NOT EXISTS AND NOT IN predicates là cách tốt nhất để tìm kiếm giá trị bị thiếu, miễn là cả hai cột được đề cập là 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

Cú pháp này có hợp lệ không? Không phải là nơi ID không có trong (...)? – Behrang

+0

Điều này sẽ không hoạt động. Cú pháp đúng phải là: 'SELECT ID FROM A ID WHERE NOT IN (SELECT ID FROM B);' – kamasheto

3

này sẽ chọn 4 trong trường hợp của bạn

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

này sẽ xóa chúng

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

EXCEPT không phải là một phần của SQL Server 2000. –

0
SELECT ID 
    FROM A 
WHERE NOT EXISTS(SELECT 1 
        FROM B 
        WHERE B.ID = A.ID 
       ) 
Các vấn đề liên quan