Saya memiliki dua tabel dengan kunci primer yang mengikat dalam database dan saya ingin menemukan satu set terputus di antara mereka. Sebagai contoh,
Table1
memiliki kolom (ID, Name
) dan contoh data:(1 ,John), (2, Peter), (3, Mary)
Table2
memiliki kolom (ID, Address
) dan contoh data:(1, address2), (2, address2)
Jadi bagaimana cara membuat kueri SQL sehingga saya bisa mengambil baris dengan ID table1
yang tidak ada di dalamnya table2
. Dalam hal ini, (3, Mary)
harus dikembalikan?
Ps. ID adalah kunci utama untuk dua tabel tersebut.
Terima kasih sebelumnya.
sql
database
postgresql
johnklee
sumber
sumber
Jawaban:
Coba ini
sumber
Menggunakan
LEFT JOIN
sumber
Pada dasarnya ada 3 pendekatan untuk itu:
not exists
,not in
danleft join / is null
.LEFT JOIN dengan IS NULL
TIDAK MASUK
TIDAK ADA
Mana yang lebih baik? Jawaban atas pertanyaan ini mungkin lebih baik dipecah menjadi vendor RDBMS khusus utama. Secara umum, seseorang harus menghindari penggunaan
select ... where ... in (select...)
ketika besarnya jumlah record dalam sub-query tidak diketahui. Beberapa vendor mungkin membatasi ukurannya. Oracle, misalnya, memiliki batas 1.000 . Hal terbaik untuk dilakukan adalah mencoba ketiganya dan menunjukkan rencana eksekusi.Secara khusus membentuk PostgreSQL, rencana pelaksanaan
NOT EXISTS
danLEFT JOIN / IS NULL
adalah sama. Saya pribadi lebih sukaNOT EXISTS
opsi karena menunjukkan maksud yang lebih baik. Setelah semua semantik adalah bahwa Anda ingin menemukan catatan A yang pk yang tidak ada di B .Tua tapi masih emas, khusus untuk PostgreSQL: https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/
sumber
Alternatif Cepat
Saya menjalankan beberapa tes (pada postgres 9.5) menggunakan dua tabel dengan masing-masing ~ 2 juta baris. Kueri di bawah ini berkinerja setidaknya 5 * lebih baik daripada kueri lain yang diusulkan:
sumber
Mengingat poin-poin yang dibuat dalam komentar / tautan @John Woo di atas, inilah cara saya biasanya menanganinya:
sumber
sumber