Làm cách nào để loại trừ các hàng không kết hợp với bảng khác?


86

Tôi có hai bảng, một bảng có khóa chính, bảng khác có khóa ngoài.

Tôi muốn lấy dữ liệu từ bảng chính, chỉ khi bảng phụ không có mục nhập chứa khóa của nó. Sắp xếp đối lập với một phép nối bên trong đơn giản, chỉ trả về các hàng nối với nhau bằng khóa đó.

Câu trả lời:


270

văn bản thay thế

SELECT <select_list> 
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL

Hình ảnh đầy đủ của tham gia văn bản thay thế

Từ bài viết: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx


9
cuối cùng! tại sao họ không có những thứ này trong sách giáo khoa và tại sao giảng viên của tôi tại uni không có những thứ này ?! họ đã sử dụng những lời giải thích tồi tệ nhất có thể xảy ra trên thế giới, chứ không phải từ xa những điều này!
pythonian29033

4
Đây là vàng. Tôi ghét viết một bình luận không có nội dung ngoài những lời khen ngợi tràn lan, nhưng thôi nào! Đây là một câu trả lời tuyệt vời. Cảm ơn bạn, @Pranay Rana.
0xbe5077ed

1
Xin hãy giải thích giùm tôi, tại sao B.Key IS NULLnhưng chúng tôi vẫn so sánh được A.Key = B.Key?
Đỗ Như Vy

1
@DoNhuVy đơn giản, so sánh nằm trong mệnh đề "BẬT", trong phép nối TRÁI hoặc PHẢI nếu không có hàng phù hợp thì một hàng có tất cả NULL được nối, sau đó bạn kiểm tra IS NULL để biết rằng không có hàng nào phù hợp . (Điều này chỉ hoạt động, bằng cách này, nếu trường bạn đang thử nghiệm là NOT NULL, tức là không thể có NULL vì một lý do khác)
Gregory Magarshak

Tôi đang sử dụng truy vấn dưới đây: SELECT A. * FROM #PurgeFilesListNew A FULL OUTER JOIN #DoNotPurgeFilesListNew B ON A.JobFileId = B.JobFileId AND A.AccountID = B.AccountID WHERE A.JobFileId IS NULL HOẶC B.JobFileId IS NULL AND A.AccountID LÀ NULL HOẶC B.AccountID IS NULL Về ​​cơ bản, tôi đang có hai so sánh hai giá trị trong mệnh đề "ON". Nó đang hoạt động tốt, nhưng truy vấn đang trả về hàng null cho những hàng không khớp. Làm thế nào để giải quyết điều này? Xin hãy giúp đỡ
HarshSharma

10
SELECT
   *
FROM
   primarytable P
WHERE
   NOT EXISTS (SELECT * FROM secondarytable S
     WHERE
         P.PKCol = S.FKCol)

Nói chung , (NOT) EXISTSlà một lựa chọn tốt hơn sau đó (NOT) INhoặc(LEFT) JOIN


cũng ông không đăng những gì DBRMS được sử dụng, tuy nhiên trong MySql LEFT JOINnhanh hơn soNOT EXIST
Các Scrum Meister

@The Scrum Meister: tôi đã nói nhanh hơn chưa? Tìm kiếm TRÊN vs EXISTS vs THAM GIA để khám phá sự khác biệt về ngữ nghĩa và logic ...
GBN

@gbn Xin lỗi, tôi nghĩ "sự lựa chọn tốt hơn" ý bạn là nhanh hơn. Sau đó, bạn có thể vui lòng giải thích theo cách nào là lựa chọn tốt hơn? Explainextended.com/2009/09/18/…
Scrum Meister

1
@The Scrum Meister: nói chung, bất kỳ loại JOIN nào cũng có thể cần DISTINCT. NOT IN với giá trị null trong danh sách là false. IN / EXISTS hoạt động giống nhau. Tuy nhiên, chỉ "an toàn" xây dựng là (KHÔNG) EXISTS trừ khi bạn thích sự mâu thuẫn
GBN


4

sử dụng kết hợp bên trái "không tồn tại":

SELECT p.*
FROM primary_table p LEFT JOIN second s ON p.ID = s.ID
WHERE s.ID IS NULL

4

Một giải pháp khác là:

SELECT * FROM TABLE1 WHERE id NOT IN (SELECT id FROM TABLE2)

3
SELECT P.*
FROM primary_table P
LEFT JOIN secondary_table S on P.id = S.p_id
WHERE S.p_id IS NULL

2
Có một câu hỏi .. nếu chúng ta đang sử dụng điều kiện P.key = S.keyvà sau đó nói where S.key IS NULL, thì điều đó không làm cho P.key là vô hiệu sao?
Somjit

2

Nếu bạn muốn chọn các cột từ Bảng thứ nhất "cũng có trong bảng Thứ hai, thì trong trường hợp này bạn cũng có thể sử dụng EXCEPT. Trong trường hợp này, tên cột cũng có thể khác nhau nhưng kiểu dữ liệu phải giống nhau.

Thí dụ:

select ID, FName
from FirstTable
EXCEPT
select ID, SName
from SecondTable

0

Điều này rất hữu ích khi sử dụng trong COGNOS vì việc tạo câu lệnh SQL "Not in" trong Cognos được cho phép, nhưng mất quá nhiều thời gian để chạy. Tôi đã mã hóa bảng A theo cách thủ công để kết hợp với bảng B trong Cognos là A.key "không phải trong" B.key, nhưng truy vấn mất quá nhiều thời gian / không trả lại kết quả sau 5 phút.

Đối với bất kỳ ai khác đang tìm kiếm giải pháp "KHÔNG VÀO" ở Cognos, đây là những gì tôi đã làm. Tạo Truy vấn kết hợp bảng A và B bằng THAM GIA TRÁI trong Cognos bằng cách chọn loại liên kết: bảng A.Key có các giá trị "0 đến N" trong bảng B, sau đó thêm Bộ lọc (các giá trị này tương ứng với Điều khoản ở đâu) cho: bảng B .Key là NULL.

Ran nhanh và như một cái duyên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.