Câu trả lời:
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL
Q : Chuyện gì đang xảy ra ở đây?
Trả lời : Về mặt khái niệm, chúng tôi chọn tất cả các hàng từ table1
và cho mỗi hàng chúng tôi cố gắng tìm một hàng table2
có cùng giá trị cho name
cột. Nếu không có hàng như vậy, chúng tôi chỉ để trống table2
phần kết quả của chúng tôi cho hàng đó. Sau đó, chúng tôi hạn chế lựa chọn của mình bằng cách chỉ chọn những hàng đó trong kết quả mà hàng phù hợp không tồn tại. Cuối cùng, chúng tôi bỏ qua tất cả các trường từ kết quả của chúng tôi ngoại trừ name
cột (trường mà chúng tôi chắc chắn tồn tại, từ table1
).
Mặc dù nó có thể không phải là phương thức hiệu quả nhất có thể trong mọi trường hợp, nhưng về cơ bản, nó nên hoạt động trong mọi công cụ cơ sở dữ liệu cố gắng thực hiện ANSI 92 SQL
Bạn có thể làm
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
hoặc là
SELECT name
FROM table2
WHERE NOT EXISTS
(SELECT *
FROM table1
WHERE table1.name = table2.name)
Xem câu hỏi này cho 3 kỹ thuật để thực hiện điều này
Tôi không có đủ điểm đại diện để bỏ phiếu cho câu trả lời thứ 2. Nhưng tôi phải không đồng ý với các ý kiến về câu trả lời hàng đầu. Câu trả lời thứ hai:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
Là FAR hiệu quả hơn trong thực tế. Tôi không biết tại sao, nhưng tôi đang chạy nó với 800 nghìn + hồ sơ và sự khác biệt là rất lớn với lợi thế được đưa ra cho câu trả lời thứ 2 được đăng ở trên. Chỉ 0,02 đô la của tôi
Đây là lý thuyết tập hợp thuần túy mà bạn có thể đạt được với minus
thao tác.
select id, name from table1
minus
select id, name from table2
SELECT <column_list>
FROM TABLEA a
LEFTJOIN TABLEB b
ON a.Key = b.Key
WHERE b.Key IS NULL;
https://www.cloudways.com/blog/how-to-join-two-tables-mysql/
Coi chừng cạm bẫy. Nếu trường Name
trong Table1
chứa Nulls, bạn sẽ gặp bất ngờ. Tốt hơn là:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT ISNULL(name ,'')
FROM table1)
Đây là những gì làm việc tốt nhất cho tôi.
SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID
Tốc độ này nhanh hơn gấp đôi so với bất kỳ phương pháp nào khác mà tôi đã thử.
Bạn có thể sử dụng EXCEPT
trong mssql hoặc MINUS
trong orory, chúng giống hệt nhau theo:
Đó là công việc sắc nét đối với tôi
SELECT *
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL
Tôi sẽ đăng lại (vì tôi chưa đủ bình luận để trả lời) trong câu trả lời đúng .... trong trường hợp bất kỳ ai khác nghĩ rằng nó cần giải thích tốt hơn.
SELECT temp_table_1.name
FROM original_table_1 temp_table_1
LEFT JOIN original_table_2 temp_table_2 ON temp_table_2.name = temp_table_1.name
WHERE temp_table_2.name IS NULL
Và tôi đã thấy cú pháp TỪ cần dấu phẩy giữa các tên bảng trong myQuery nhưng trong sqlLite dường như thích khoảng trắng hơn.
Điểm mấu chốt là khi bạn sử dụng tên biến xấu, nó để lại câu hỏi. Các biến của tôi sẽ có ý nghĩa hơn. Và ai đó nên giải thích tại sao chúng ta cần một dấu phẩy hoặc không có dấu phẩy.