【发布时间】:2014-08-27 15:40:00
【问题描述】:
我需要显示特定仓库当前库存的所有产品,以及产品表中的所有产品。这将包括库存量。如果该产品未在特定仓库的库存中列出,则需要显示 0。
产品表中有 33 种不同的产品。这是我用来查找该信息的查询:
SELECT DISTINCT ID
FROM S_PRODUCT;
我正在查看的仓库专门包含 14 种产品。这是我用来查找的查询。
SELECT PRODUCT_ID
FROM S_INVENTORY
WHERE WAREHOUSE_ID = 301;
我的最终结果应该列出所有 33 个产品 ID,但只显示仓库 301 库存中物品的数量。不在该库存中的所有产品的数量都应显示为 0。我尝试过外部联接和其他杂项查询,但都没有运气。请帮忙!我应该注意我正在使用oracle。
ERD 中表的屏幕截图
尝试外连接和大小写。
SELECT I.PRODUCT_ID,
CASE I.AMOUNT_IN_STOCK
WHEN NULL
THEN 0
ELSE I.AMOUNT_IN_STOCK
END AS "IN_STOCK"
FROM S_PRODUCT P
LEFT OUTER JOIN
S_INVENTORY I
ON P.ID = I.PRODUCT_ID
WHERE I.WAREHOUSE_ID = 301;
PRODUCT_ID IN_STOCK
---------- ----------
20510 69
20512 28
30321 85
30421 102
30433 35
32779 102
32861 57
40421 70
40422 65
41010 59
41020 61
41050 49
41080 50
41100 42
14 rows selected
尝试使用 AND 而不是 WHERE 注意:空行也是输出的一部分
PRODUCT_ID IN_STOCK
---------- ----------
20510 69
20512 28
30321 85
30421 102
30433 35
32779 102
32861 57
40421 70
40422 65
41010 59
41020 61
41050 49
41080 50
41100 42
33 rows selected
【问题讨论】:
-
如果您需要两个表中的 ALL,您不需要完全外连接吗?此外,要么将 where 子句移动到连接中,要么使用
(i.warehouse_ID = 301 OR i.warehouse_ID is null)误读。只需将您的 where 子句移至联接。不需要 Where 子句。 -
更新了我的答案以修复缺失的信息。查询现在返回了正确的数据,我们现在需要正确显示。