2014-08-27 108 views
1

我需要顯示特定倉庫當前庫存中的所有產品,以及產品表中的所有產品。這將包括庫存量。如果該產品未在特定倉庫的庫存中列出,則需要顯示0.如何檢索庫存中的所有產品,以及SQL中的所有產品?

產品表中有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 
+1

如果你需要兩個表中的ALL,你不需要一個完整的外連接嗎?另外,或者將where子句移動到連接或使用或者'(i.warehouse_ID = 301或者i.warehouse_ID爲空)'Misread。只需將您的where子句移動到聯接。否子句需要。 – xQbert 2014-08-27 16:13:01

+1

更新了我的答案以解決缺少的信息。查詢現在返回正確的數據,我們現在只需要正確顯示。 – 2014-08-27 16:59:23

回答

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都將爲空。因此,cartesean生成,然後在那裏消除左連接保存的記錄。通過移動限制來加入過濾器發生在cartesean之前。

+0

我在上面添加了該查詢的結果。 – billabrian6 2014-08-27 16:34:16

+1

更新選擇拉從產品,而不是庫存'杜'不是所有的產品都在倉庫301 ...並使用coalese來處理空值,而不是案件..因爲我不是不確定null可以這種方式進行評估。你看到的空白是因爲我們需要引用s_product而不是S_Inventory來獲取值。 – xQbert 2014-08-27 17:17:40

+0

這工作完美!非常感謝您的幫助。 – billabrian6 2014-08-27 21:29:42

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的地方。如果庫存表沒有返回匹配項,則我使用CASE語句顯示0或它顯示實際值。

+0

這正是我認爲的解決方案,但不幸的是它只返回14行。我在上面的帖子中添加了結果。 – billabrian6 2014-08-27 16:07:05

+3

我的查詢與您的查詢不同,我沒有'WHERE'子句。我認爲'WHERE I.WAREHOUSE_ID = 301'取消了你的'LEFT OUTER JOIN'並給你一個'INNER JOIN'。 – 2014-08-27 16:17:49