2012-12-13 35 views
11

Khi tôi thực hiện truy vấn sau đây:Tại sao INNER JOIN không bằng (! =) Treo mãi mãi

SELECT * FROM `table1` 
INNER JOIN table2 ON table2.number = table1.number 

tôi nhận được kết quả trong vòng 2 giây. Có khoảng 6 triệu bản ghi trong table2 và 1 triệu bản ghi trong table1

table2.numbertable1.number được lập chỉ mục.

Bây giờ tôi muốn có danh sách các số không tồn tại. Như thế này:

SELECT * FROM `table1` 
INNER JOIN table2 ON table2.number != table1.number 

Mất vĩnh viễn và vẫn treo .. Cách khắc phục?

+0

Hãy suy nghĩ về bao nhiêu ghi lại mỗi triệu trong bảng 2 sẽ tham gia vào hàng triệu bảng 1. –

Trả lời

27

Giả sử INNER JOIN đầu tiên của bạn trả về 75% trong số 1.000.000 hàng trong table1. Truy vấn thứ hai không trả về 250.000 hàng khác như bạn nghĩ. Thay vào đó, nó cố gắng tạo ra một sản phẩm Descartes và loại bỏ 750.000 hàng phù hợp. Vì vậy, nó đang cố gắng trả lại 6.000.000 × 1.000.000-750.000 hàng. Đó là phình 6 tập kết quả hàng.

Bạn có thể muốn điều này:

SELECT * FROM table1 
LEFT JOIN table2 ON table2.number = table1.number 
WHERE table2.number IS NULL 

này trả hàng trong table1 không có mặt trong table2.

Bạn cũng có thể quan tâm FULL OUTER JOIN:

SELECT * FROM table1 
FULL OUTER JOIN table2 ON table2.number = table1.number 
WHERE table1.number IS NULL AND table2.number IS NULL 

này trả hàng trong cả hai bảng mà không có một trận đấu trên bàn khác.

6

Lý do điều này không hoạt động là nguyên nhân cơ bản của bạn gia nhập mỗi hàng của table1 với mỗi hàng với bảng 2. Bạn cần một cái gì đó để vẫn tham gia với nó. Cách tốt nhất để làm điều này là thực hiện một phép nối trái (Nghĩa là nó sẽ tham gia table1 bất kể cái gì, nhưng không phải table2) và sau đó kiểm tra để chắc chắn rằng không có một mục nhập cho table2 với null. Sau đó bạn sẽ cần phải làm điều tương tự cho table2.

SELECT * FROM `table1` 
LEFT JOIN table2 ON table2.number = table1.number 
WHERE table2.number is NULL 

UNION 

SELECT * FROM `table2` 
LEFT JOIN table1 ON table2.number = table1.number 
WHERE table1.number is NULL 
+0

Câu trả lời hay :-) –

0

Thay vì điều này, bạn có thể sử dụng phương pháp này: SELECT * FROM table1 LEFT JOIN table2 ON table2.number = table1.number ĐÂU table2.number là NULL OR table1.number là NULL

Các vấn đề liên quan