Chaque fois que je dois vérifier l'existence d'une ligne dans une table, j'ai tendance à toujours écrire une condition telle que:
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
)
Certaines personnes écrivent comme ceci:
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
)
Lorsque la condition est NOT EXISTS
remplacée par EXISTS
: Dans certains cas, je peux l'écrire avec une LEFT JOIN
condition supplémentaire (parfois appelée antijointure ):
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
J'essaie de l'éviter parce que je pense que le sens est moins clair, en particulier lorsque ce qui vous primary_key
manque n'est pas évident, ou lorsque votre clé primaire ou votre condition de jointure est multi-colonne (et vous pouvez facilement oublier l'une des colonnes). Cependant, vous conservez parfois du code écrit par quelqu'un d'autre ... et il est juste là.
Y a-t-il une différence (autre que le style) à utiliser à la
SELECT 1
placeSELECT *
?
Existe-t-il des cas où cela ne se comporte pas de la même manière?Bien que ce que j’ai écrit soit le code SQL (AFAIK) standard: existe-t-il une telle différence pour différentes bases de données / versions antérieures?
Y-a-t-il un avantage à écrire explicitement un anti-jointure?
Les planificateurs / optimistes contemporains le traitent-ils différemment de laNOT EXISTS
clause?
EXISTS (SELECT FROM ...)
.