【问题标题】:How to join data from multiple table keeping all distinct values如何连接来自多个表的数据,保留所有不同的值
【发布时间】:2021-12-30 16:58:12
【问题描述】:

我有三张桌子:

文章:

idArticle
libArticle

库存:

idArticle
idWarehouse
qtyStock

仓库:

idWarehouse
libWarehouse

在表格库存中,我只有文章可用 因此,例如,如果数据是:

文章:

890001 'Article1'
890002 'Article2'

仓库:

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

库存:

890001 0001 50
890001 0002 30
890002 0003 20

我想提出一个显示每篇文章的 qtyStock 的请求,如果没有库存,qtyStock 中会显示“0”,并且每个仓库都有一行,例如:

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

我试过了:

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

它可以工作,但是没有这种子请求有没有更好的方法?

【问题讨论】:

    标签: sql oracle join left-join


    【解决方案1】:

    结果可以通过文章和仓库的简单CROSS JOIN得到所有组合,然后LEFT JOIN库存。

    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
    

    【讨论】:

    • 完美,我找到了一个带有子请求的解决方案,但我更喜欢你的,更干净:) 我不习惯交叉加入
    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2013-01-22
    • 2021-06-01
    • 2021-12-06
    • 2014-10-05
    相关资源
    最近更新 更多