Ilekroć muszę sprawdzić, czy istnieje jakiś wiersz w tabeli, zwykle piszę taki warunek:
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
)
Niektóre inne osoby piszą to tak:
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
)
Gdy warunek jest NOT EXISTS
zamiast EXISTS
: W niektórych przypadkach mogę napisać go z LEFT JOIN
dodatkowym warunkiem (czasami nazywanym anty - dołączeniem ):
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
Staram się tego unikać, ponieważ uważam, że znaczenie jest mniej jasne, szczególnie gdy to, co jest twoje, primary_key
nie jest tak oczywiste, lub gdy twój klucz podstawowy lub warunek łączenia jest wielokolumnowy (i możesz łatwo zapomnieć o jednej z kolumn). Czasami jednak utrzymujesz kod napisany przez kogoś innego ... i to jest właśnie tam.
Czy jest jakaś różnica (inna niż styl) do użycia
SELECT 1
zamiastSELECT *
?
Czy istnieje przypadek narożny, w którym nie zachowuje się tak samo?Chociaż to, co napisałem, to standardowy SQL (AFAIK): Czy istnieje taka różnica dla różnych baz danych / starszych wersji?
Czy pisanie antijoin ma jakąś przewagę?
Czy współcześni planiści / optymaliści traktują to inaczej niżNOT EXISTS
klauzula?
EXISTS (SELECT FROM ...)
.