user2178964
user2178964

Reputation: 154

How to join data from multiple table keeping all distinct values

I have three tables :

article :

idArticle
libArticle

stock :

idArticle
idWarehouse
qtyStock

warehouse :

idWarehouse
libWarehouse

In the table stock, I only have the article available So, for exemple, if the data are :

article :

890001 'Article1'
890002 'Article2'

warehouse :

0001 'Warehouse Est'
0002 'Warehouse West'
0003 'Warehouse South'

stock :

890001 0001 50
890001 0002 30
890002 0003 20

I want to make a request which display the qtyStock for each article, with "0" in qtyStock if there is not in stock, AND a line for each warehouse, like :

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

I tried :

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

It works, but is there a better way to do it without that kind of subrequest ?

Upvotes: 1

Views: 37

Answers (1)

EJ Egyed
EJ Egyed

Reputation: 6084

The result can be achieved with a simple CROSS JOIN of article and warehouse to get all combinations, then LEFT JOIN stock.

WITH
    article (idarticle, libarticle)
    AS
        (SELECT '890001', 'Article1' FROM DUAL
         UNION ALL
         SELECT '890002', 'Article2' FROM DUAL),
    stock (idarticle, idwarehouse, qtystock)
    AS
        (SELECT '890001', '0001', 50 FROM DUAL
         UNION ALL
         SELECT '890001', '0002', 30 FROM DUAL
         UNION ALL
         SELECT '890002', '0003', 20 FROM DUAL),
    warehouse (idwarehouse, libwarehouse)
    AS
        (SELECT '0001', 'Warehouse Est' FROM DUAL
         UNION ALL
         SELECT '0002', 'Warehouse West' FROM DUAL
         UNION ALL
         SELECT '0003', 'Warehouse South' FROM DUAL)
  SELECT a.idarticle, w.idwarehouse, NVL (s.qtystock, 0) AS stock
    FROM article a
         CROSS JOIN warehouse w
         LEFT JOIN stock s ON (a.idarticle = s.idarticle AND w.idwarehouse = s.idwarehouse)
ORDER BY a.idarticle, w.idwarehouse;



   IDARTICLE    IDWAREHOUSE    STOCK
____________ ______________ ________
890001       0001                 50
890001       0002                 30
890001       0003                  0
890002       0001                  0
890002       0002                  0
890002       0003                 20

Upvotes: 1

Related Questions