Setiap kali saya perlu memeriksa keberadaan beberapa baris dalam sebuah tabel, saya cenderung selalu menulis kondisi seperti:
SELECT a, b, c
FROM a_table
WHERE EXISTS
(SELECT * -- This is what I normally write
FROM another_table
WHERE another_table.b = a_table.b
)
Beberapa orang lain menulisnya seperti:
SELECT a, b, c
FROM a_table
WHERE EXISTS
(SELECT 1 --- This nice '1' is what I have seen other people use
FROM another_table
WHERE another_table.b = a_table.b
)
Ketika kondisinya NOT EXISTS
bukan EXISTS
: Dalam beberapa kesempatan, saya mungkin menulisnya dengan LEFT JOIN
dan dan kondisi tambahan (kadang-kadang disebut antijoin ):
SELECT a, b, c
FROM a_table
LEFT JOIN another_table ON another_table.b = a_table.b
WHERE another_table.primary_key IS NULL
Saya mencoba menghindarinya karena saya pikir artinya kurang jelas, khususnya ketika apa yang Anda primary_key
tidak jelas, atau ketika kunci utama Anda atau kondisi gabungan Anda adalah multi-kolom (dan Anda dapat dengan mudah melupakan salah satu kolom). Namun, kadang-kadang Anda mempertahankan kode yang ditulis oleh orang lain ... dan itu ada di sana.
Apakah ada perbedaan (selain gaya) untuk digunakan,
SELECT 1
bukanSELECT *
?
Apakah ada sudut yang tidak berperilaku sama?Meskipun apa yang saya tulis adalah (AFAIK) SQL standar: Apakah ada perbedaan untuk database yang berbeda / versi yang lebih lama?
Apakah ada keuntungan dari kejujuran menulis antijoin?
Apakah perencana / pengoptimal kontemporer memperlakukannya secara berbeda dariNOT EXISTS
klausa?
EXISTS (SELECT FROM ...)
.