sql - multiple - La sintaxis de Oracle deja unir tres o más tablas
pivot oracle ejemplos (2)
Estoy tratando de entender mi antigua sintaxis de Oracle Left Join. Está bien con dos tablas:
FROM A, B
WHERE
A.Col = B.Col (+)
(Vamos a llamar a esta consulta, Q0)
Esto es bastante fácil de entender, por ejemplo, con este diagrama de Venn
Pero cuando agregamos una tercera tabla o más a la mezcla, es cuando mi cerebro quiere cerrar:
FROM A,B,C
WHERE
A.C = B.C (+) AND
C.C = A.C (+)
(Vamos a llamar a este Q1)
Que debería ser igual a: (Acabo de cambiar de lugar en las condiciones de combinación izquierda)
FROM A,B,C
WHERE
C.C = A.C (+) AND
A.C = B.C (+)
(Vamos a llamar a esto Q2)
Así que aquí está mi opinión sobre estas consultas, mi pregunta aquí es si lo he entendido correctamente:
A mi entender, una forma de interpretar las uniones a la izquierda de más de 2 tablas es verlo como una cadena de combinaciones a la izquierda, donde una es la entrada a la otra, ¿ es correcto?
Entonces en Q1 tenemos dos uniones a la izquierda, la primera es A Left Unida con B donde A es la tabla de la izquierda. La segunda unión a la izquierda es donde empieza a ser difícil para mí. Al principio pensé que era la mesa C a la izquierda unida con la mesa A donde C era la mesa de la izquierda. Pero esto parece ser incorrecto, más bien se debe ver como C se unió a la izquierda con el resultado de la primera combinación a la izquierda, donde C es la tabla de la izquierda. ¿Es esto correcto?
Pero, ¿cómo aplico este "principio de cadena" en la Q2?
Traté de copiar el razonamiento de Q1: la primera unión es una C a la izquierda unida con A, donde C es la tabla de la izquierda. La segunda unión es una combinación a la izquierda entre A y el resultado de la primera unión, donde A es la tabla de la izquierda. Pero esto no tiene sentido, la condición de unión de la segunda combinación a la izquierda está entre las columnas A y B, y no hay una columna B en el resultado de la primera combinación a la izquierda.
Por curiosidad, traté de cambiar las tablas izquierda y derecha en la segunda unión, es decir, el resultado de la primera unión actuaría en cambio como la tabla izquierda en la segunda unión izquierda, se unió a la izquierda con B. Y parece que esto funciona, el resultado se convierte en lo mismo que Q1. Pero no tengo idea de cómo explicar por qué eso funciona.
Entonces, si alguien pudiera sugerir una forma de razonamiento para aplicar genéricamente para tres o más tablas al usar la sintaxis de Oracle, sería muy apreciado. También sería bueno si dicho método genérico consistiera en una forma general de traducir una sintaxis de Oracle a sintaxis ANSI, ya que puedo entenderlo mucho más fácilmente.
(+) las uniones externas de estilo son inferiores en términos de funcionalidad en comparación con las UNIONES EXTERNAS ANSI estándar (así como la legibilidad en mi humilde opinión), que Oracle apoyó desde el 9i.
Lo que quieres es efectivamente
FROM C
LEFT JOIN A ON C.C = A.C
LEFT JOIN B ON A.C = B.C
¿Tiene sentido ahora? Para ser sincero, no entiendo muy bien tus preguntas porque la forma en que funciona la sintaxis anterior es realmente obvia para mí ...
Puedes verlo en forma de cascada. Sin embargo, la clave es buscar aquellas tablas que se unen a la izquierda y a la derecha dentro de la misma consulta. En este caso, el orden es diferente: la condición donde la tabla está unida a la derecha se aplica primero. Espero que el siguiente diagrama arroje algo de luz sobre esto:
También puede verificar el orden de estas uniones mirando el plan de ejecución de la consulta:
Para Q1:
select a.c a, b.c b, c.c c from a, b, c where a.c = b.c (+) and
c.c = a.c (+)
------------------------------------------------------------------------
| Id | Operation | Name | E-Rows | OMem | 1Mem | Used-Mem |
------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | | |
|* 1 | HASH JOIN OUTER | | 4 | 2168K| 2168K| 805K (0)|
|* 2 | HASH JOIN OUTER | | 4 | 2616K| 2616K| 981K (0)|
| 3 | TABLE ACCESS FULL| C | 4 | | | |
| 4 | TABLE ACCESS FULL| A | 4 | | | |
| 5 | TABLE ACCESS FULL | B | 4 | | | |
------------------------------------------------------------------------
Para Q2:
select a.c a, b.c b, c.c c from a, b, c where c.c = a.c (+) and
a.c = b.c (+)
------------------------------------------------------------------------
| Id | Operation | Name | E-Rows | OMem | 1Mem | Used-Mem |
------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | | |
|* 1 | HASH JOIN OUTER | | 4 | 2168K| 2168K| 801K (0)|
|* 2 | HASH JOIN OUTER | | 4 | 2616K| 2616K| 983K (0)|
| 3 | TABLE ACCESS FULL| C | 4 | | | |
| 4 | TABLE ACCESS FULL| A | 4 | | | |
| 5 | TABLE ACCESS FULL | B | 4 | | | |
------------------------------------------------------------------------