我需要显示特定仓库中当前库存的所有产品,以及产品表中的所有产品。这将包括库存量。如果该产品未列在特定仓库的库存中,则需要显示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
答案 0 :(得分:2)
我没有对此进行过测试,但我认为你的答案应该是这样的:
为MS SQL编写:
SELECT p.ID, CASE NVL(i.AMOUNT_IN_STOCK, '0') WHEN '0' THEN 0 ELSE i.AMOUNT_IN_STOCK END StockLevel
FROM S_PRODUCT p LEFT OUTER JOIN
S_INVENTORY i ON p.PRODUCT_ID = i.PRODUCT_ID AND i.WAREHOUSE_ID = 301
我正在从产品表中选择所有产品并加入产品ID上的库存表,并且只选择仓库为301
的位置。如果Inventory表没有返回匹配,那么我使用CASE
语句显示0或显示实际值。
答案 1 :(得分:1)
做什么:
SELECT P.PRODUCT_ID,
coalesce(i.amount_in_Stock,0) AS "IN_STOCK"
FROM S_PRODUCT P
LEFT OUTER JOIN S_INVENTORY I
ON P.ID = I.PRODUCT_ID
AND I.WAREHOUSE_ID = 301;
返回?
- 注意缺少WHERE子句以及i.warehouse_ID移动到连接。这是因为I.warehouse ID将从S_PRODUCT中消除记录,从而否定左外连接。因为如果在该产品的301的s_Inventory中没有条目,则所有i.warehouse_ID都将为null。因此,cartesean生成,然后删除左连接保留的记录。通过将限制移动到过滤器的连接发生在cartesean之前。