Mysql
 sql >> Database >  >> RDS >> Mysql

Left join è commutativo? Quali sono le sue proprietà?

Wikipedia:

"In matematica, un'operazione binaria è commutativa se la modifica dell'ordine degli operandi non cambia il risultato. È una proprietà fondamentale di molte operazioni binarie e da essa dipendono molte prove matematiche."

Risposta:

no, un join sinistro non è commutativo. E lo è l'unione interna.

Ma non è proprio quello che stai chiedendo.

È la seguente query:

TableA INNER JOIN TableB LEFT JOIN TableC LEFT JOIN TableD

(tutti uniti a una colonna id) equivalente a:

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    

Risposta:

Anche no. I sindacati e le unioni in realtà non ottengono la stessa cosa, in generale. In alcuni casi potresti essere in grado di scriverli in modo equivalente, ma non penso che tu stia mostrando uno pseudo sql così generale. La costituzione ON sembra non funzionare (forse qualcosa di cui non so in MySQL?)

Ecco un insieme semplificato di query che penso sarebbero equivalenti.

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

Modifica 2:

Ecco un altro esempio più vicino al tuo ma in sostanza lo stesso.

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

è uguale a

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

Ma io ancora non pensare che sto rispondendo alla tua vera domanda.