Mysql
 sql >> Base de données >  >> RDS >> Mysql

La jointure à gauche est-elle commutative ? Quelles sont ses propriétés ?

Wikipédia :

"En mathématiques, une opération binaire est commutative si la modification de l'ordre des opérandes ne change pas le résultat. C'est une propriété fondamentale de nombreuses opérations binaires, et de nombreuses preuves mathématiques en dépendent."

Réponse :

non, une jointure à gauche n'est pas commutative. Et la jointure interne l'est.

Mais ce n'est pas vraiment ce que vous demandez.

Est la requête suivante :

TableA INNER JOIN TableB LEFT JOIN TableC LEFT JOIN TableD

(tous joints à une colonne id) équivalent à :

TableA INNER JOIN TableB
       INNER JOIN TableC
        LEFT JOIN TableD   
UNION     
TableA INNER JOIN TableB
        LEFT JOIN TableC ON TableB.c_id IS NULL
        LEFT JOIN TableD    

Réponse :

Aussi non. Les unions et les jointures n'accomplissent pas vraiment la même chose, d'une manière générale. Dans certains cas, vous pourrez peut-être les écrire de manière équivalente, mais je ne pense pas que le pseudo sql général que vous montrez. La constitution ON semble ne pas fonctionner (peut-être quelque chose que je ne connais pas dans MySQL ?)

Voici un ensemble simplifié de requêtes qui, à mon avis, seraient équivalentes.

SELECT * 
  FROM TableA a 
       LEFT JOIN 
       TableB b ON a.id = b.id_a 

SELECT * 
  FROM TableA a 
       INNER JOIN 
       TableB b ON a.id = b.id_a 
UNION      
SELECT * 
  FROM TableA a  
       LEFT JOIN 
       TableB b ON a.id = b.id_a 
 WHERE TableB.id IS NULL

Éditer 2 :

Voici un autre exemple qui est plus proche de votre mais essentiellement le même.

SELECT * 
  FROM            TableA a 
       INNER JOIN TableB b ON a.id = b.id_a 
        LEFT JOIN TableC c ON b.id = c.id_b 

est le même que

SELECT * 
  FROM TableA a 
       INNER JOIN TableB b ON a.id = b.id_a 
       INNER JOIN TableC c ON b.id = c.id_b 
UNION      
SELECT * 
  FROM TableA a  
       INNER JOIN TableB b ON a.id = b.id_a 
        LEFT JOIN TableC c ON b.id = c.id_b 
 WHERE TableC.id IS NULL

Mais je toujours ne pense pas que je réponds à ta vraie question.