Sempre que preciso verificar a existência de alguma linha em uma tabela, costumo escrever sempre uma condição como:
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
)
Algumas outras pessoas escrevem assim:
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 a condição é NOT EXISTS
em vez de EXISTS
: Em algumas ocasiões, posso escrevê-la com a LEFT JOIN
e uma condição extra (às vezes chamada de 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
Eu tento evitá-lo porque acho que o significado é menos claro, especialmente quando o que é seu primary_key
não é tão óbvio, ou quando sua chave primária ou sua condição de junção é multi-coluna (e você pode facilmente esquecer uma das colunas). No entanto, às vezes você mantém o código escrito por outra pessoa... e ele está lá.
Existe alguma diferença (além do estilo) para usar
SELECT 1
em vez deSELECT *
?
Existe algum caso de canto em que não se comporte da mesma maneira?Embora o que escrevi seja o SQL padrão (AFAIK): Existe essa diferença para diferentes bancos de dados / versões mais antigas?
Existe alguma vantagem em escrever explicitamente um antijoin?
Os planejadores/otimizadores contemporâneos a tratam de forma diferente daNOT EXISTS
cláusula?