如何连接来自多个表的数据,保留所有不同的值

Posted

技术标签:

【中文标题】如何连接来自多个表的数据,保留所有不同的值【英文标题】: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

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

【问题讨论】:

【参考方案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

【讨论】:

完美,我找到了一个带有子请求的解决方案,但我更喜欢你的,更干净:) 我不习惯交叉加入

以上是关于如何连接来自多个表的数据,保留所有不同的值的主要内容,如果未能解决你的问题,请参考以下文章

连接来自两个不同表的两列

如何使用 Python 连接来自多个 netCDF 文件的数据

添加两个变量,其中包含来自同一数据库的两个不同表的值

连接来自不同数据库的同名表的结果

如何比较来自不同列和不同行但同一张表的值?

SQL:对来自两个不同表的值求和