2012-09-29 26 views
19

Dada la siguiente manera unirse a 3orden de combinación declaración de operación

select t1.* from t1 
left join t2 on t1.fk = t2.pk 
join t3 on t2.fk = t3.pk 

Si la unión entre t2 y t3 fallado, sería la primera fila de la exitosa unión entre t1 y t2 ser devueltos? Si el orden de operación va de izquierda a derecha, supongo que no, pero si se evalúa de derecha a izquierda (t3 se une primero a t2), t1 se devolverá incluso cuando el anterior falló.

¿Cómo funciona?

Respuesta

35

La colocación de las cláusulas ON controla el orden lógica de evaluación.

Así que primero ocurre el t1 LEFT JOIN t2 ON t1.fk = t2.pk. El resultado de esta unión es una tabla virtual que contiene todas las filas coincidentes de t1, t2 y (debido a que es una combinación externa izquierda) las filas t1 no coincidentes también se conservan con valores nulos para las columnas t2.

Esta tabla virtual luego participa en la siguiente unión. JOIN t3 ON t2.fk = t3.pk

Cualquier t2 registros que no coinciden con las filas de t1 no son parte de la salida de la tabla virtual de la primera etapa de lo que no aparecerán en el resultado final. Además, esta unión interna en t2.fk = t3.pk perderá todos los valores NULL de t2.fk convirtiendo efectivamente todo su conjunto en uniones internas. El procesamiento de consultas

lógica se explica así by Itzik Ben Gan here

+0

Las respuestas a la punta y es muy completo en la explicación. Gracias por la ayuda. – Alwyn

+0

Explicación fácil y fácil Me pregunto ¿se aplica el mismo orden de operación a 'sqlite'? –

+0

@MuhammadBabar - No he usado SQLLite, pero si se adhiere a SQL estándar (ANSI/ISO) lo hará. –

Cuestiones relacionadas