web-dev-qa-db-fra.com

Qu'est-ce que semi-join dans la base de données?

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?

7
DarkShadow

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.

7
Iurii Ant

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
)
2
Lukasz Szozda