Bagaimana cara mengecualikan baris yang tidak bergabung dengan tabel lain?

87

Saya memiliki dua tabel, satu memiliki kunci utama yang lain memilikinya sebagai kunci asing.

Saya ingin menarik data dari tabel utama, hanya jika tabel sekunder tidak memiliki entri yang berisi kuncinya. Urutkan kebalikan dari gabungan dalam sederhana, yang hanya mengembalikan baris yang bergabung bersama oleh kunci itu.

Chaddeus
sumber

Jawaban:

274

teks alt

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

Gambar lengkap bergabung teks alt

Dari aticle: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx

Pranay Rana
sumber
9
akhirnya! mengapa mereka tidak memiliki ini di buku teks dan mengapa dosen saya di universitas tidak memilikinya ?! mereka menggunakan penjelasan yang paling buruk di dunia, tidak terlalu dekat dengan ini!
pythonian29033
5
Ini emas. Saya benci menulis komentar yang tidak berisi apa-apa selain pujian yang berlebihan, tapi ayolah! Ini jawaban yang luar biasa. Terima kasih, @Pranay Rana.
0xbe5077ed
1
Tolong jelaskan untuk saya, mengapa B.Key IS NULLtapi kami masih sebanding A.Key = B.Key?
Do Nhu Vy
1
@DoNhuVy sederhana, perbandingannya ada di klausa "ON", di LEFT atau RIGHT join jika tidak ada baris yang cocok maka baris dengan semua NULL digabungkan, setelah itu Anda menguji IS NULL untuk mengetahui bahwa tidak ada baris yang cocok . (
Ngomong
Saya menggunakan kueri di bawah ini: 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 ATAU B.JobFileId IS NULL AND A.AccountID IS NULL ATAU B.AccountID IS NULL Pada dasarnya, saya memiliki dua membandingkan dua nilai dalam klausa "ON". Ini berfungsi dengan baik, tetapi kueri mengembalikan baris nol untuk baris yang tidak cocok. Bagaimana mengatasi ini? Tolong bantu
HarshSharma
10
SELECT
   *
FROM
   primarytable P
WHERE
   NOT EXISTS (SELECT * FROM secondarytable S
     WHERE
         P.PKCol = S.FKCol)

Umumnya , (NOT) EXISTSadalah pilihan yang lebih baik dari (NOT) INatau(LEFT) JOIN

gbn
sumber
Yah dia tidak memposting apa DBRMS digunakan, namun di MySql LEFT JOINmengungguliNOT EXIST
The Scrum Meister
@ The Scrum Meister: apakah saya mengatakan lebih cepat? Cari IN vs EXISTS vs GABUNG untuk menemukan perbedaan semantik dan logis ...
gbn
@gbn Maaf, saya pikir dengan "pilihan yang lebih baik" yang Anda maksud lebih cepat. Bisakah Anda menjelaskan dengan cara apa itu pilihan yang lebih baik? menjelaskanextended.com/2009/09/18/…
The Scrum Meister
1
@ The Scrum Meister: umumnya, semua jenis JOIN mungkin memerlukan DISTINCT. NOT IN dengan null dalam daftar memberikan false. IN / EXISTS berperilaku sama. Namun, satu-satunya konstruksi "aman" adalah (TIDAK) ADA kecuali jika Anda menyukai ketidakkonsistenan
gbn
4

gunakan gabungan kiri "tidak ada":

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

Solusi lainnya adalah:

SELECT * FROM TABLE1 WHERE id NOT IN (SELECT id FROM TABLE2)
Ali Akbar
sumber
3
SELECT P.*
FROM primary_table P
LEFT JOIN secondary_table S on P.id = S.p_id
WHERE S.p_id IS NULL
Tommi
sumber
2
Punya pertanyaan .. jika kita menggunakan kondisi P.key = S.keydan kemudian berkata where S.key IS NULL, bukankah itu juga membuat P.key null?
Somjit
2

Jika Anda ingin memilih kolom dari First Table "yang juga ada di tabel Second, maka dalam hal ini Anda juga bisa menggunakan EXCEPT. Dalam hal ini, nama kolom bisa berbeda juga tapi tipe datanya harus sama.

Contoh:

select ID, FName
from FirstTable
EXCEPT
select ID, SName
from SecondTable
Anil Soman
sumber
0

Ini berguna untuk digunakan di COGNOS karena membuat pernyataan SQL "Not in" di Cognos diperbolehkan, tetapi butuh waktu terlalu lama untuk dijalankan. Saya telah mengkodekan tabel A secara manual untuk digabungkan ke tabel B di Cognos sebagai A.key "bukan di" B.key, tetapi kueri tersebut memakan waktu terlalu lama / tidak mengembalikan hasil setelah 5 menit.

Untuk orang lain yang mencari solusi "TIDAK MASUK" di Cognos, inilah yang saya lakukan. Buat Query yang menggabungkan tabel A dan B dengan LEFT JOIN di Cognos dengan memilih jenis link: tabel A.Key memiliki nilai "0 ke N" di tabel B, lalu menambahkan Filter (ini sesuai dengan Klausul Dimana) untuk: tabel B .Key adalah NULL.

Berlari cepat dan seperti pesona.

JennyB
sumber