如何连接来自多个表的数据,保留所有不同的值
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
【讨论】:
完美,我找到了一个带有子请求的解决方案,但我更喜欢你的,更干净:) 我不习惯交叉加入以上是关于如何连接来自多个表的数据,保留所有不同的值的主要内容,如果未能解决你的问题,请参考以下文章