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.
B.Key IS NULL
tapi kami masih sebandingA.Key = B.Key
?SELECT * FROM primarytable P WHERE NOT EXISTS (SELECT * FROM secondarytable S WHERE P.PKCol = S.FKCol)
Umumnya ,
(NOT) EXISTS
adalah pilihan yang lebih baik dari(NOT) IN
atau(LEFT) JOIN
sumber
LEFT JOIN
mengungguliNOT EXIST
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
sumber
Solusi lainnya adalah:
SELECT * FROM TABLE1 WHERE id NOT IN (SELECT id FROM TABLE2)
sumber
SELECT P.* FROM primary_table P LEFT JOIN secondary_table S on P.id = S.p_id WHERE S.p_id IS NULL
sumber
P.key = S.key
dan kemudian berkatawhere S.key IS NULL
, bukankah itu juga membuat P.key null?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
sumber
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.
sumber