Wenn ich in einer Tabelle nach einer Zeile suchen muss, schreibe ich in der Regel immer eine Bedingung wie:
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
)
Einige andere Leute schreiben es so:
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
)
Wenn die Bedingung ist NOT EXISTS
statt EXISTS
: In einigen Fällen könnte ich es schreibe mit ein LEFT JOIN
und einer zusätzlichen Bedingung (manchmal ein genannt 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
Ich versuche es zu vermeiden, weil ich denke, dass die Bedeutung weniger klar ist, besonders wenn das, was Ihr primary_key
ist, nicht so offensichtlich ist, oder wenn Ihr Primärschlüssel oder Ihre Join-Bedingung mehrspaltig ist (und Sie leicht eine der Spalten vergessen können). Manchmal behält man jedoch Code bei, der von jemand anderem geschrieben wurde ... und der ist einfach da.
Gibt es einen Unterschied (außer Stil) zu verwenden,
SELECT 1
anstattSELECT *
?
Gibt es einen Eckfall, in dem es sich nicht gleich verhält?Obwohl das, was ich geschrieben habe, (AFAIK) Standard-SQL ist: Gibt es einen solchen Unterschied für verschiedene Datenbanken / ältere Versionen?
Gibt es einen Vorteil, wenn explizit ein Antijoin geschrieben wird?
Behandeln zeitgenössische Planer / Optimierer dies anders als in derNOT EXISTS
Klausel?
EXISTS (SELECT FROM ...)
.