Table1               Table2                 Table3           Table4
Sl Name City       index len bre       col tax income      price dicount org
1  ABC   XYZ       1     10   12       1   23   40          1   10      XYZ
2  DEF   asd       2     12   14       2   24   42          2   6       asd
3  ghi   jkl                           3   78   89          3    0      gah

Estas entradas corresponden a las respectivas tablas. Quiero obtener datos de las 4 tablas independientemente de si los valores están presentes en la Tabla2 o no. Cualquier valor nulo en la Tabla2 no debería obstaculizar la salida.

select tab1.Name,
        tab2.len,
        tab3.tax,
        tab4.org
From Table1  tab1,
     Table2  tab2, 
     Table3  tab3,   
     Table4  tab4
where tab1.sl=tab2.index(+)
AND      tab2.index(+)=tab3.col
AND   tab3.col=tab4.price;

Esta consulta solo devuelve resultados para aquellos Sl para los que hay una entrada en la tabla 2. ¿Cómo puedo resolver esto?

0
Jhon 29 dic. 2016 a las 17:00
3
Mysql no es compatible (+) me parece que está utilizando la base de datos de Oracle
 – 
Raymond Nijland
29 dic. 2016 a las 17:07
3
Muéstrenos el resultado deseado. No tengo del todo claro lo que está intentando hacer. Y sí, la sintaxis de combinación (+) se parece a Oracle y no debería usarla de todos modos.
 – 
Tim Biegeleisen
29 dic. 2016 a las 17:08
Si está utilizando esto dentro de una declaración merge, incluya la declaración completa.
 – 
CGritton
30 dic. 2016 a las 13:51

3 respuestas

Para utilizar una combinación izquierda ANSI adecuada:

select tab1.Name,
        tab2.len,
        tab3.tax,
        tab4.org
From Table1  tab1  
     inner join Table3  tab3 on tab1.sl.tab3.col
     inner join Table4  tab4 on tab3.col=tab4.price
     left join Table2  tab2 on tab1.sl=tab2.index;

Esto hace que su código sea mucho más legible.

1
CGritton 29 dic. 2016 a las 17:11
La sintaxis de la combinación externa ANSI es mucho más clara que la anterior de Oracle.
 – 
APC
29 dic. 2016 a las 19:27
En realidad, estoy escribiendo un procedimiento y esta declaración de selección está dentro de Merge. La combinación interna mientras se ejecuta la combinación de procedimiento no funcionará.
 – 
Jhon
30 dic. 2016 a las 13:48
Hola Cgritton, necesito ayuda para formular una nueva consulta, si es posible, ¿podrían ayudarme? Publiqué esa pregunta hace फेव आवर्ज
 – 
Jhon
9 mar. 2017 a las 23:37

Intenta seguir ---

select tab1.Name,
        tab2.len,
        tab3.tax,
        tab4.org
From 
   Table1  tab1 left join Table2  tab2  
on tab1.sl=tab2.index(+) join Table3  tab3 
on tab2.index(+)=tab3.col join Table4  tab4 
on tab3.col=tab4.price;
0
meet 29 dic. 2016 a las 17:08
En realidad, estoy escribiendo un procedimiento y esta declaración de selección está dentro de Merge. La combinación interna mientras se ejecuta la combinación de procedimiento no funcionará.
 – 
Jhon
30 dic. 2016 a las 13:48

Mire, debería pasar de la década de 1990 a principios de la de 2000, reescribiendo su consulta sin la sintaxis 'orrible omega-join (+).

Al convertir omega en join, su consulta sale así.

SELECT tab1.Name,
       tab2.len,
       tab3.tax,
       tab4.org
  FROM Table1  tab1,
 left  join  Table2  tab2 ON tab1.sl=tab2.index
 right join  Table3  tab3 ON tab2.index=tab3.col 
 inner join  Table4  tab4 ON tab3.col=tab4.price;

Y, luego, la combinación aparentemente caótica de operaciones de unión derecha, izquierda e interna sugiere la solución a su problema.

Cambie a todas las combinaciones izquierdas y sus filas Table1 no se suprimirán cuando no coincidan con otras tablas.

      SELECT tab1.Name,
             tab2.len,
             tab3.tax,
             tab4.org
        FROM Table1 tab1
   LEFT JOIN Table2 tab2 ON tab1.sl=tab2.index
   LEFT JOIN Table3 tab3 ON tab2.index=tab3.col 
   LEFT JOIN Table4 tab4 ON tab3.col=tab4.price;

Incluso si debe usar la antigua sintaxis de unión omega, debe usarla de una manera que no suprima filas de Table1

select tab1.Name,
        tab2.len,
        tab3.tax,
        tab4.org
From Table1  tab1,
     Table2  tab2, 
     Table3  tab3,   
     Table4  tab4
where tab1.sl=tab2.index(+)
AND   tab2.index=tab3.col(+)
AND   tab3.col=tab4.price(+);

La posición de (+) a la derecha significa que es una combinación izquierda y viceversa.

0
O. Jones 30 dic. 2016 a las 15:27
En realidad, estoy escribiendo un procedimiento y esta declaración de selección está dentro de Merge. La combinación interna mientras se ejecuta la combinación de procedimiento no funcionará.
 – 
Jhon
30 dic. 2016 a las 13:48
Por supuesto , las operaciones de combinación funcionan en declaraciones de combinación. Simplemente no tienes la sintaxis correcta todavía. En cualquier caso, vea mi edición. Su configuración de combinación está suprimiendo filas que no coinciden de las tablas incorrectas.
 – 
O. Jones
30 dic. 2016 a las 15:29