Query SQL


([N2] ceferino) #1

Hola amigos del foro:
A ver si hay por aquí alguien que controle SQL.
Estoy intentando realizar una consulta sobre varias tablas de una BBDD SQlite. El tema es que una tabla (Albaran) tiene cinco maestros o punteros FOREING KEY sobre una misma Tabla (Articulo) y al montar la consulta, si no están cubiertos los cinco campos de los maestros no devuelve nada:
SELECT
A._id, A.cantidad, A.unidades, H.name, Cmt.name, Cmt.marca, A.cmtkg, Adcc.name, Adcc.marca, A.adcckg, Adt1.name, Adt1.marca, A.adt1kg, Adt2.name, Adt2.marca, A.adt2kg, Adt3.name, Adt3.marca, A.adt3kg, A.r_AC, A.Pedido, A.Sumin
FROM
Albaran A, Articulo H, Articulo Cmt, Articulo Adcc, Articulo Adt1, Articulo Adt2, Articulo Adt3
WHERE A._id = itemId
AND A.hormg = H._id
AND A.cmt = Cmt._id
AND A.adcc = Adcc._id
AND A.adt1 = Adt1._id
AND A.Adt2 = Adt2._id AND A.Adt3 = Adt3._id;
Muchas gracias
Ceferino


([N1] adelo) #2

Buenos días:

Estás poniendo como condición que el campo tenga valor, añade la posibilidad de que sea nulo también:

AND (( A.hormg = H._id ) OR (A.hormg IS NULL)) …

Un saludo.


([N2] ceferino) #3

Muchas gracias, Adelo:
He realizado la modificacion que me has propuesto y ahora, en vez de un registro o ficha, devuelve dieciseis filas.
Además, como el nombre de las columnas de la tabla maestra se llama name las rellena todas sin distinción, aunque el campo de la tabla sea NULL.
Uff, los querys de SQL…
Adjunto pantalla por si tuvieras curiosidad…
En realidad solo las siete primeras columnas estarian correctas, las demas deberian estar vacias…

Saludos
Ceferino



([N3] pacosatu) #4

Hola Ceferino.

Usa la cláusula LEFT JOIN en cada relación que establezcas, para obtener todos los Albaranes independientemente de si tienen o no claves externas.

Un saludo
Paco Satué


([N2] ceferino) #5

Muchas gracias, Paco:

Intentaré documentarme con ese comando. Está uno acostumbrao a Velneo y esto de salir de casa a explorar nuevos mundos…ye fastidiao

Saludos
Ceferino


([N2] ceferino) #6

Efectivamente, Paco:
Con el comando LEFT JOIN obtengo el resultado apetecido, un solo registro y las columnas rellenadas correctamente.
Quedaria así, finalmente:
SELECT
A._id, A.cantidad, A.unidades, H.name, Cmt.name, Cmt.marca, A.cmtkg, Adcc.name, Adcc.marca, A.adcckg, Adt1.name, Adt1.marca, A.adt1kg, Adt2.name, Adt2.marca, A.adt2kg, Adt3.name, Adt3.marca, A.adt3kg, A.r_AC, A.pedido, A.sumin, A.central
FROM
Albaran A
LEFT JOIN Articulo H ON A.hormg = H._id
LEFT JOIN Articulo Cmt ON A.cmt = Cmt._id
LEFT JOIN Articulo Adcc ON A.adcc = Adcc._id
LEFT JOIN Articulo Adt1 ON A.adt1 = Adt1._id
LEFT JOIN Articulo Adt2 ON A.adt2 = Adt2._id
LEFT JOIN Articulo Adt3 ON A.adt3 = Adt3._id
WHERE A._id = 280800;

Muchas gracias a todos
Ceferino


([N3] pacosatu) #7

Hola Ceferino.

Me alegro que hayas resuelto el problema.
Te aconsejo que conozcas los comandos principales del SQL estandar, porque lo tendrás que usar en las consultas de la mayor parte de fuentes externas de datos.
No solo sirve para bases de datos, sino para cualquier fuente de información estructurada, por ejemplo una hoja de Excel.

Suerte y saludos
Paco Satué