Ne zaman bir masada bir satırın olup olmadığını kontrol etmem gerektiğinde, her zaman şöyle bir koşul yazma eğilimindeyim:
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
)
Diğer bazı insanlar şöyle yazıyor:
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
)
Durum NOT EXISTS
yerine EXISTS
: Ne zaman bazı durumlarda, ben LEFT JOIN
ve ekstra bir durumla (bazen bir antijoin denir ) yazabilirim :
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
Bundan kaçınmaya çalışıyorum, çünkü anlamın daha az açık olduğunu düşünüyorum, özellikle sizin açık olanın ne primary_key
kadar belirgin olmadığı veya birincil anahtarınız veya birleştirme şartınız çok sütunlu olduğunda (ve sütunlardan birini kolayca unutabilirsiniz). Ancak, bazen başka biri tarafından yazılan kodu koruyorsunuz ... ve tam da orada.
Kullanmak
SELECT 1
yerine ( stil dışında) herhangi bir fark var mıSELECT *
?
Aynı şekilde davranmadığı herhangi bir köşe kılıfı var mı?Yazdığım (AFAIK) standart SQL olmasına rağmen: Farklı veritabanları / eski sürümler için böyle bir fark var mı?
Bir karşıtlık yazma açıklığının herhangi bir avantajı var mı?
Çağdaş planlamacılar / optimize ediciler, onuNOT EXISTS
maddeden farklı şekilde ele alıyor mu?
EXISTS (SELECT FROM ...)
.