如何检索库存中的所有产品,以及SQL可用的任何产品?

时间:2014-08-27 15:40:01

标签: sql oracle10g

我需要显示特定仓库中当前库存的所有产品,以及产品表中的所有产品。这将包括库存量。如果该产品未列在特定仓库的库存中,则需要显示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中表格的屏幕截图

Screenshot of the tables in the 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 

2 个答案:

答案 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之前。