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 EXISTSzamiast EXISTS: W niektórych przypadkach mogę napisać go z LEFT JOINdodatkowym 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_keynie 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 1zamiastSELECT *?
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 EXISTSklauzula?



EXISTS (SELECT FROM ...).