Ogni volta che devo verificare l'esistenza di una riga in una tabella, tendo a scrivere sempre una condizione come:
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
)
Alcune altre persone lo scrivono come:
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
)
Quando la condizione è NOT EXISTS
invece di EXISTS
: In alcune occasioni, potrei scriverla con una LEFT JOIN
e una condizione extra (a volte chiamata 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
Cerco di evitarlo perché penso che il significato sia meno chiaro, specialmente quando ciò che è tuo primary_key
non è così ovvio, o quando la tua chiave primaria o la tua condizione di join è multi-colonna (e puoi facilmente dimenticare una delle colonne). Tuttavia, a volte mantieni il codice scritto da qualcun altro ... ed è proprio lì.
C'è qualche differenza (oltre allo stile) da usare al
SELECT 1
posto diSELECT *
?
C'è qualche caso angolare in cui non si comporta allo stesso modo?Anche se quello che ho scritto è (AFAIK) SQL standard: esiste una tale differenza per diversi database / versioni precedenti?
C'è qualche vantaggio sulla scrittura esplicita di un antijoin?
I pianificatori / ottimizzatori contemporanei lo trattano in modo diverso dallaNOT EXISTS
clausola?
EXISTS (SELECT FROM ...)
.