SQL - Consulta de 3 tablas incluyendo resultados vacios

 
Vista:

Consulta de 3 tablas incluyendo resultados vacios

Publicado por Luis Hernandez (1 intervención) el 16/10/2014 20:54:48
Buen dia, requiero hacer una consulta de 3 tablas, la contiene ubicaciones, la segunda inventario y la tercera el catalogo de productos. Lo que necesito es un reporte que me muestre todas las localidades (Tabla A), me indique si esta localidad tiene inventario(tabla B) y me arroje la descripcion del producto (Tabla C)

Esta es la sentencia que he generado, pero no ubico como agregar la informacion de la tercera tabla, lo he intentado de distintas formas, pero cuando logro que me muestre el campo de descripcion del producto(TablaB) deja de mostrarme las ubicaciones vacias(tabla A)

En esta sentencia solo estoy obteniendo el catalogo de ubicaciones y validando si existe inventario o no, me falta agregar la descripcion del producto.


select distinct A.loc_code, B.loc_code, B.invt_qty, b.productID,
from ubicaciones A
left join inventario B
on B.company(+)=A.company
and B.loc_code(+)=A.loc_code
where A.company='AA'
order by A.loc_code


De antemano agradezco la ayuda, Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Consulta de 3 tablas incluyendo resultados vacios

Publicado por leonardo_josue (1173 intervenciones) el 16/10/2014 22:02:11
Hola Luis Hernandez:

Olvidaste mencionar algunas cuantas cosas que son necesarias para poder darte una respuesta puntual:

1. ¿Qué motor de BD's estás utilizando? Aunque todos los motores tienen una sintaxis similar, también hay diferencias importantes, por lo tanto resulta darte una respuesta puntual. Por la sintaxis pudiera tratarse de ORACLE, pero sólo Dios y tú lo saben en estos momentos.
2. ¿Cuál es la estructura de tus tablas? ¿qué campos son llaves y/o cómo están relacionadas entre sí?
3. Dices qué no has podido obtener la información de la tercer tabla, pero no nos dices cómo trataste de incluir esa tercer tabla, ni tampoco nos dices dónde está el problema, es decir, si tuviste algún error, no nos dices que error es, si no te presenta los datos correctos, tampoco nos dices qué es lo que esperas obtener como resultado, ni nos pones datos de ejemplo.

Según lo que entiendo, lo único que debes hacer es incluir la tabla restante también con un LEFT JOIN, pero al no poner la información completa como menciono en los puntos anteriores, no puedo decirte en donde está el problema. Checa este ejemplo, en MySQL, creo que sería algo como lo que quieres hacer.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
mysql> SELECT * FROM tabla1;
+------+-------------+
| idT1 | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | dos         |
|    3 | tres        |
|    4 | cuatro      |
+------+-------------+
4 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla2;
+------+------+-------------+
| idT2 | idT1 | descripcion |
+------+------+-------------+
|    1 |    1 | uno.uno     |
|    2 |    2 | dos.dos     |
|    3 |    3 | tres.tres   |
+------+------+-------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla3;
+------+------+------+-------------+
| idT3 | idT1 | idT2 | descripcion |
+------+------+------+-------------+
|    1 |    1 |    1 | uno.uno.uno |
|    2 |    2 |    2 | dos.dos.uno |
+------+------+------+-------------+
2 rows in set (0.00 sec)
 
 
mysql> SELECT T1.idT1, T1.descripcion, T2.idT2, T2.descripcion, T3.idT3, T3.descripcion
    -> FROM tabla1 T1
    -> LEFT JOIN tabla2 T2 ON T1.idT1 = T2.idT1
    -> LEFT JOIN tabla3 T3 ON T2.idT1 = T3.idT1 AND T2.idT2 = T3.idT2;
+------+-------------+------+-------------+------+-------------+
| idT1 | descripcion | idT2 | descripcion | idT3 | descripcion |
+------+-------------+------+-------------+------+-------------+
|    1 | uno         |    1 | uno.uno     |    1 | uno.uno.uno |
|    2 | dos         |    2 | dos.dos     |    2 | dos.dos.uno |
|    3 | tres        |    3 | tres.tres   | NULL | NULL        |
|    4 | cuatro      | NULL | NULL        | NULL | NULL        |
+------+-------------+------+-------------+------+-------------+
4 rows in set (0.00 sec)

Observa que en la tabla aparecen TODOS LOS ELEMENTOS DE LA TABLA1, relacionados con sus respectivos elementos de las tablas 2 y 3, sin embargo, en el caso de NO EXISTIR ELEMENTOS EN DICHAS TABLAS, entonces se respetan los nulos.

Dale un vistazo, espero que te sirva, si continuas con problemas, contesta los puntos que puse al inicio del post y con gusto tratamos de ayudarte.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Consulta de 3 tablas incluyendo resultados vacios

Publicado por Luis (3 intervenciones) el 17/10/2014 19:32:43
1. ¿Qué motor de BD's estás utilizando? ORACLE
2. Como lo mencione antes tengo una tabla A que contiene las ubicaciones de un almacen, misma que se liga con la tabla B que contiene el inventario de cada ubicacion, y que se ligan
por medio del campo loc_code A.loc_code=B.loc_code, luego tenemos la tabla C que es el catalogo de productos, y la estoy ligando con la tabla B por medio del campo productID
B.productID=C.productID
3. El resultado deseado es un listado de todas las ubicaciones (llenas o vacias) y el producto almacenado en cada una de ellas, asi como su descripcion.

Esta es la sentencia que genere en base a tus sugerencias:

select distinct A.loc_code Ubicacion,
B.loc_code validaubicacion,
B.invt_qty as cantidad,
B.productID as NoParte,
C.product_DES1 as Descripcion,
B.invt_lev2 as Tarima
from Ubicaciones A
left join Inventario B
on B.company(+)=A.company
and B.loc_code(+)=A.loc_code
left join Productos C
on C.productID=B.productID
where A.company='AA'
order by A.loc_code


Esta consulta me da el resultado que deseo, solo que en algunos casos me esta duplicando resultados, por ejemplo me arroja "N" filas con resultados unicos, luego "M" filas en donde la fila M = Fila M+1

Te anexo imagen


INV_ANUAL


Te agradezco tu respuesta, Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Consulta de 3 tablas incluyendo resultados vacios

Publicado por leonardo_josue (1173 intervenciones) el 17/10/2014 21:07:02
Hola de nuevo Luis:

Veo tres posibles problemas en la consulta.

1. En el sentido estricto de BD's, los registros que muestras en colores NO ESTÁN DUPLICADOS, aunque pudieran parecerlo. para Base de Datos, un registro es DUPLICADO sí y sólo si TODOS SUS CAMPOS SON EXACTAMENTE IGUALES.

En tu caso, si observas el campo 5, donde viene una descripción de producto, existe un PUNTO en el número final que aparece, es decir no es lo mismo 1 8, que 1.8. Todas los casos que marcas con color tienen el mismo detalle, revisa primeramente que en tu tabla NO EXISTAN LLAVES DUPLICADAS CON DESCRIPCIONES DISTINTAS, ya que obviamente esto te acarreará errores en la consulta.

2. Estás mezclando dos formas de hacer el JOIN lo cual es un terrible error... si observas la documentación:

http://docs.oracle.com/javadb/10.3.3.0/ref/rrefsqlj18922.html

Podrás ver que en la cláusula ON NO SE COLOCA EL (+), ya que este se utiliza cuando haces los JOIN's de manera implícita,

http://www.dba-oracle.com/tips_oracle_left_outer_join.htm

es decir:

1
2
3
...
FROM tabla1, tabla2 WHERE tabla1.campo (+) = tabla2.campo
...

Es equivalente a

1
2
3
...
FROM tabla1 LEFT JOIN tabla2 ON tabla1.campo = tabla2.campo
...

En tu caso, estás mezclando ambas formas, lo cual puede traerte problemas. prueba quitando el (+) de la cláusula ON para ver si la consulta se corrige.

3. Es posible que haya alguna otra relación entre los datos que estés omitiendo, por lo tanto se esté ejecutando un producto cartesiano entre las tablas, pero para revisar eso, tendrías que colocar POR SEPARADO (tal como te pedía en el primer post), la estructura de tus tablas y algunos datos de ejemplo para cada una de ellas. De esta manera podríamos ayudarte a revisar que no falte ninguna condición en el ON del JOIN.

Revisa lo que te comento y nos avisas si continuas con problemas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Consulta de 3 tablas incluyendo resultados vacios

Publicado por Luis (3 intervenciones) el 18/10/2014 00:11:13
Ok, ya revise lo que me comentas y lo que estaba sucediendo es que en el JOIN entre las tablas B y C no estaba especificando que tuvieran la misma compañia ( C.company=B.company) y como me comentas hace la combinacion con las dos compañias que encuentra, de las cuales una cuenta con la descripcion con un PUNTO en el número final (Compañia A) y la otra tiene la misma descripcion pero sin ese PUNTO en el numero final (Compañia B).

Esta es la sentencia que genere en base a tus sugerencias:

select distinct A.loc_code Ubicacion,
B.loc_code validaubicacion,
B.invt_qty as cantidad,
B.productID as NoParte,
C.product_DES1 as Descripcion,
B.invt_lev2 as Tarima
from Ubicaciones A
left join Inventario B
on B.company=A.company
and B.loc_code=A.loc_code
left join Productos C
on C.company=B.company
and C.productID=B.productID
where A.company='AA'
order by A.loc_code

Te agradezco la ayuda que me proporcionaste.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar