Pour rester dans le cas de cette discussion, imaginons la besoin suivant :
Quelles sont les vidéos qui ont un historique ?
Allons un peu plus loin :
Quelles sont les lignes de la table video pour lesquelles il existe au moins une ligne dans la table historique ?
Réponse :
1 2 3 4 5 6 7 8
| SELECT v.titre
FROM video v
WHERE EXISTS
(
SELECT *
FROM historique h
WHERE h.id_video = v.id_video
) |
Ça ressemble à une jointure sauf que la jointure va mettre en relation toutes les lignes de la table historique qui correspondent à une ligne de la table video alors qu'avec EXISTS, la recherche de correspondance s'arrête dès qu'une ligne est trouvée. Comme dans le besoin exprimé je n'ai pas besoin des informations figurant dans la table historique mais seulement de savoir s'il existe un historique, EXISTS est potentiellement plus performant que JOIN.
Idem pour NOT EXISTS si je cherche les vidéos qui n'ont pas d'historique : dès que le SGBD trouve une ligne dans historique qui correspond à la ligne de video inspectée, il passe à la vidéo suivante.
Partager