2010-10-28 13 views
27

ai đó có thể giúp tôi viết sql cho một scernerio như thế này:Trái ngược với một Inner Tham Query

Table 1 

2 columns: ID, Name 

Table 2 

2 columns: ID, Name 

Tôi muốn có một truy vấn để hiển thị tên từ bảng 1 mà không phải là trong bảng 2. Vì vậy, lọc ra tất cả các các tên trong bảng 1 nằm trong bảng 2 là truy vấn kết quả. Sử dụng ID cho tên không lọc.

Điều này sẽ giúp tôi trong những gì tôi đang cố gắng làm. Cảm ơn trước

+0

Nick, tất cả các đề xuất bên dưới (những đề xuất tham gia và kiểm tra giá trị rỗng và những đề xuất sử dụng mệnh đề NOT IN) sẽ hoạt động. Tuy nhiên, nếu tốc độ là một vấn đề, tôi tin rằng NOT IN là chậm hơn. Nếu tốc độ không phải là vấn đề, thì NOT IN có thể rõ ràng hơn. – Matt

+0

Ngược lại với INNER JOIN là một OUTER JOIN và nó có hai hương vị: LEFT và RIGHT tùy thuộc vào bên nào của JOIN bạn muốn "bên ngoài" –

+1

@Matt: niềm tin của bạn sai, 'NOT IN' nhanh hơn . – Quassnoi

Trả lời

43
Select * from table1 
left join table2 on table1.id = table2.id 
where table2.id is null 
+1

NOT EXISTS nhanh hơn nhiều. https://github.com/ebergstedt/sql_performance_left_outer_join_null_vs_not_exists –

16

Sử dụng truy vấn này

select 
t1.* 
from table1 t1 
left outer join table2 t2 
on t1.id=t2.id 
where t2.id is null 

làm việc này bằng cách tham gia tất cả mọi thứ trong t1 đến bất cứ điều gì tồn tại trong t2. mệnh đề where lọc ra tất cả các bản ghi không tồn tại trong t2.

3
SELECT Table1.ID, Table1.Name, Table2.ID 
FROM Table1 LEFT OUTER JOIN Table2 ON Table1.ID = Table2.ID 
WHERE Table2.ID IS NULL 

Tôi nghĩ rằng nên làm điều đó.

20

Điều này sẽ hoạt động tốt hơn phiên bản left join...is null. Xem herehere để so sánh.

select t1.id, t1.name 
    from table1 t1 
    where not exists(select null from table2 t2 where t2.id = t1.id) 
+0

Hình phạt hiệu suất –

+0

@Eduardo Cuomo: Không có trong SQL Server. –

+0

Tôi kiểm tra nó trên SQL Server và 500.000 bản ghi. 3 giây và 15 giây ... –