sql >> Base de Datos >  >> RDS >> Mysql

¿La unión izquierda es conmutativa? ¿Cuáles son sus propiedades?

Wikipedia:

"En matemáticas, una operación binaria es conmutativa si cambiar el orden de los operandos no cambia el resultado. Es una propiedad fundamental de muchas operaciones binarias y muchas demostraciones matemáticas dependen de ella".

Respuesta:

no, una combinación izquierda no es conmutativa. Y la unión interna es.

Pero eso no es realmente lo que estás preguntando.

Es la siguiente consulta:

TableA INNER JOIN TableB LEFT JOIN TableC LEFT JOIN TableD

(todos unidos a una columna de 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    

Respuesta:

También no. Uniones y uniones realmente no logran lo mismo, en términos generales. En algunos casos, es posible que pueda escribirlos de manera equivalente, pero no creo que el pseudo sql general que está mostrando. La constitución ON parece que no debería funcionar (¿tal vez algo sobre lo que no sé en MySQL?)

Aquí hay un conjunto simplificado de consultas que creo que serían equivalentes.

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

Edición 2:

Aquí hay otro ejemplo que está más cerca de ti pero en esencia es lo mismo.

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

es lo mismo 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

Pero yo todavía no creas que estoy respondiendo tu verdadera pregunta.