Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Ist Linksverknüpfung kommutativ? Was sind seine Eigenschaften?

Wikipedia:

"In der Mathematik ist eine binäre Operation kommutativ, wenn das Ändern der Reihenfolge der Operanden das Ergebnis nicht ändert. Es ist eine grundlegende Eigenschaft vieler binärer Operationen, und viele mathematische Beweise hängen davon ab."

Antwort:

Nein, eine Linksverknüpfung ist nicht kommutativ. Und Inner Join ist.

Aber das ist nicht wirklich das, wonach Sie fragen.

Ist die folgende Abfrage:

TableA INNER JOIN TableB LEFT JOIN TableC LEFT JOIN TableD

(alle mit einer ID-Spalte verbunden) Äquivalent zu:

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    

Antwort:

Auch Nein. Unions und Joins erreichen im Allgemeinen nicht wirklich dasselbe. In einigen Fällen können Sie sie möglicherweise gleichwertig schreiben, aber ich glaube nicht, dass Sie so allgemeines Pseudo-SQL zeigen. Die ON-Verfassung scheint nicht zu funktionieren (vielleicht etwas, worüber ich in MySQL nichts weiß?)

Hier ist ein vereinfachter Satz von Abfragen, die meiner Meinung nach gleichwertig wären.

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

Bearbeiten 2:

Hier ist ein weiteres Beispiel, das Ihrem ähnlicher ist, aber im Wesentlichen dasselbe ist.

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

ist dasselbe wie

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

Aber ich noch glaube nicht, dass ich deine eigentliche Frage beantworte.