2013-04-08 35 views
5

Tôi cố gắng để soạn một câu lệnh SELECT cho MySQL mà chọn từ bảng A những gì không tồn tại trong bảng B. Ví dụ:Chọn từ bảng A mà không tồn tại trong bảng B

Bảng A:

+------+ 
| BAND | 
+------+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
+------+ 

bảng B:

+------+ 
| HATE | 
+------+ 
| 1 | 
| 5 | 
+------+ 

Vì vậy, nếu bảng A là tất cả các băng, và bảng B là ban nhạc tôi ghét, thì tôi chỉ muốn ban nhạc tôi không ghét. Vì vậy, kết quả của một lựa chọn nên là:

+------+ 
| BAND | 
+------+ 
| 2 | 
| 3 | 
| 4 | 
+------+ 

Làm thế nào tôi sẽ viết một lựa chọn duy nhất cho điều này? Đây là nỗ lực cuối cùng của tôi:

SELECT * FROM A LEFT JOIN B ON A.BAND = B.HATE WHERE B.HATE IS NULL; 

EDIT: Dòng trên đã được sửa! Xem bình luận bên dưới ... "= NULL" so với "IS NULL".

+1

@Michelle truy vấn của bạn có vẻ là ok. tại sao bạn nói nó không hoạt động? – Barranka

+0

Xem nhận xét của tôi bên dưới. Đối với bất kỳ ai khác có cùng một vấn đề "IS NULL" thì không giống với "= NULL" trong MySQL. Tôi đã thử một cách và truy vấn hoạt động, cách khác nó trả về một tập rỗng. Lạ thật !!! – TSG

+0

Không chỉ trong MySQL, mà còn trên bất kỳ phương ngữ SQL nào. Giá trị 'NULL' trong SQL có thuộc tính khác với bất kỳ giá trị nào khác, bao gồm một' NULL' khác. Do đó, bạn không thể mong đợi '= NULL' để làm việc trên một truy vấn SQL ... bạn cần sử dụng' IS NULL'. – Barranka

Trả lời

16

Tôi sẽ sử dụng một tham gia

select A.* 
from A left join B on A.BAND = B.HATE 
where B.HATE IS NULL; 

Hãy nhớ rằng: Tạo các chỉ số phù hợp với bảng

+0

Điều đó gần giống với những gì tôi đã thử (xem câu trả lời ở trên). Bạn chỉ yêu cầu A. * trả lại từ câu lệnh chọn ... có lẽ đó là vấn đề. – TSG

+0

và nó sẽ cung cấp cho bạn câu trả lời đúng! (Nhân tiện, tôi đã đăng bài này trước khi bạn chỉnh sửa). Điều này sẽ trả lại những gì bạn cần. Hay tại sao bạn nói nó không trả lại những gì bạn cần? – Barranka

+0

OK - Tôi đã tìm thấy sự cố! Tôi đã thử nghiệm cho "B.HATE = NULL", không phải "B.HATE IS NULL". Văn bản của tôi ở trên là những gì tôi đã sử dụng để tạo lệnh SQL của mình, nhưng khi tôi thực sự đã nhập mã (vào một chuỗi PHP), tôi đã thay đổi nó thành = NULL. Lạ thật là chúng khác nhau sao !? – TSG

5

Bạn có thể sử dụng IN, nhưng đó là siêu hiệu quả:

SELECT * FROM tableA WHERE id NOT IN (SELECT id FROM tableB) 
+2

Tại sao điều này tốt hơn sử dụng kết nối? –

+2

Tôi sẽ nghĩ rằng điều này là chậm nếu bảng A hoặc B là lớn (đối với bảng nhỏ, sự khác biệt hiệu suất là thực tế không có gì) – Barranka

+1

Tôi không bao giờ nói nó là tốt hơn, tôi thực sự nói ngược lại. 'IN' hút, bởi vì nó chạy truy vấn bên trong cho mỗi hàng được kiểm tra (vì vậy, đối với mỗi hàng trong' tableA'). –

0
SELECT * FROM tableA WHERE id NOT EXISTS (SELECT DISTINCT id FROM tableB) 

hoặc

SELECT * FROM tableA WHERE id NOT EXISTS (SELECT id FROM tableB GROUP BY id) 
-2
SELECT BAND FROM A WHERE BAND NOT EXISTS(SELECT DISTINCT HATE FROM B) 

HOẶC

SELECT BAND FROM A WHERE NOT EXISTS (SELECT HATE FROM B WHERE A.BAND = B.HATE); 
Các vấn đề liên quan