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 como:
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 é em NOT EXISTS
vez de EXISTS
: Em algumas ocasiões, eu posso escrevê-la com uma 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 é composta por várias colunas (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) a ser usada em
SELECT 1
vez deSELECT *
?
Existe algum caso de esquina em que não se comporte da mesma maneira?Embora o que eu escrevi seja o padrão SQL (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 o tratam de maneira diferente daNOT EXISTS
cláusula?
EXISTS (SELECT FROM ...)
.