es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo unir datos de múltiples tablas manteniendo todos los valores distintos.

Tengo tres tablas:

article:

idArticle
libArticle

stock:

idArticle
idWarehouse
qtyStock

warehouse:

idWarehouse
libWarehouse

En la tabla stock, solo tengo el artículo disponible. Entonces, por ejemplo, si los datos son:

article:

890001 ‘Article1’
890002 ‘Article2’

warehouse:

0001 ‘Warehouse Este’
0002 ‘Warehouse Oeste’
0003 ‘Warehouse Sur’

stock:

890001 0001 50
890001 0002 30
890002 0003 20

Quiero hacer una consulta que muestre el qtyStock para cada artículo, con “0” en qtyStock si no está en stock, Y una línea para cada almacén, como:

890001 0001 50
890001 0002 30
890001 0003 0
890002 0001 0
890002 0002 0
890002 0003 20

He intentado:

select a.idwarehouse, a.idarticle, s.qtystock from
(
select idwarehouse, idarticle
from article, warehouse
where idarticle IN (‘890001’, ‘890002’)
) a
left join stock s on a.idwarehouse = s.idwarehouse and a.idarticle = s.idarticle

Funciona, pero ¿hay una mejor manera de hacerlo sin ese tipo de subconsulta?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes obtener el mismo resultado con una simple unión entre las tres tablas. Aquí está la consulta:

    SELECT a.idArtículo, w.idAlmacén, COALESCE(s.cantidadStock, 0) AS cantidadStock
    FROM artículo a
    CROSS JOIN almacén w
    LEFT JOIN stock s ON s.idArtículo = a.idArtículo AND s.idAlmacén = w.idAlmacén
    ORDER BY a.idArtículo, w.idAlmacén
    

    Aquí, primero realizamos una unión cruzada entre las tablas artículo y almacén para obtener todas las combinaciones posibles de artículos y almacenes. Luego, unimos el resultado con la tabla stock para obtener el valor de cantidadStock donde exista. Usamos la función COALESCE para reemplazar los valores nulos (artículos sin stock en un almacén) con ‘0’. Finalmente, ordenamos el resultado por los IDs de artículo y almacén.

Comments are closed.