Je ne parviens pas à comprendre le concept de semi-jointure et à quel point il est différent de celui-ci. J'ai déjà essayé un article mais je ne suis pas satisfait de l'explication. Est-ce que quelqu'un pourrait m'aider à le comprendre?
Exemple simple. Choisissons les étudiants dont les notes utilisent la jointure externe gauche:
SELECT DISTINCT s.id
FROM students s
LEFT JOIN grades g ON g.student_id = s.id
WHERE g.student_id IS NOT NULL
Maintenant la même chose avec la demi-jointure gauche:
SELECT s.id
FROM students s
WHERE EXISTS (SELECT 1 FROM grades g
WHERE g.student_id = s.id)
Ce dernier est beaucoup plus efficace.
Pour autant que je sache, les dialectes SQL prenant en charge SEMIJOIN/ANTISEMI
sont U-SQL/Cloudera Impala.
SEMIJOIN :
Semijoins sont le moyen utilisé par U-SQL pour filtrer un ensemble de lignes en fonction de l'inclusion de ses lignes dans un autre ensemble. D'autres dialectes SQL expriment cela avec le modèle SELECT * FROM A WHERE A.key IN (SELECT B.key FROM B).
Plus d'infos Les jointures semi et anti-jointes doivent avoir leur propre syntaxe SQL :
"Semi" signifie que nous ne rejoignons pas vraiment le côté droit, nous vérifions seulement si une jointure produirait des résultats pour un Tuple donné.
-- IN
SELECT *
FROM Employee
WHERE DeptName IN (
SELECT DeptName
FROM Dept
)
-- EXISTS
SELECT *
FROM Employee
WHERE EXISTS (
SELECT 1
FROM Dept
WHERE Employee.DeptName = Dept.DeptName
)