Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

A junção à esquerda é comutativa? Quais são suas propriedades?


Wikipédia:

"Em matemática, uma operação binária é comutativa se mudar a ordem dos operandos não altera o resultado. É uma propriedade fundamental de muitas operações binárias, e muitas provas matemáticas dependem disso."

Responda:

não, uma junção à esquerda não é comutativa. E a junção interna é.

Mas não é bem isso que você está perguntando.

É a seguinte consulta:
TableA INNER JOIN TableB LEFT JOIN TableC LEFT JOIN TableD

(todos unidos a uma coluna 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    

Responda:

Também não. Uniões e junções não realizam a mesma coisa, em geral. Em alguns casos, você pode escrevê-los de forma equivalente, mas não acho tão geral o pseudo sql que você está mostrando. A constituição ON parece que não deve funcionar (talvez algo sobre o qual eu não saiba no MySQL?)

Aqui está um conjunto simplificado de consultas que eu acho que seria equivalente.
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

Edição 2:

Aqui está outro exemplo que está mais próximo do seu, mas em essência o mesmo.
SELECT * 
  FROM            TableA a 
       INNER JOIN TableB b ON a.id = b.id_a 
        LEFT JOIN TableC c ON b.id = c.id_b 

é o mesmo 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

Mas eu ainda não pense que estou respondendo sua pergunta real.