2013-04-05 76 views
1

似乎無法讓我的頭在此。我有三個表格(股票,銷售,採購訂單)與產品有關的一個共同的領域,可以加入他們所有。我有第四張桌子,裏面放着所有的產品。產品可能有或沒有這些表中的信息(庫存,銷售,採購訂單),但在產品表中會有記錄。SQL;全左,右,上,內,反向連接

我需要結束一行每個產品,其中有三個表(股票,銷售和採購訂單)之一的信息。

表的簡化視圖低於:

產品表,參考,描述

庫存表,REF Current_Stock

銷售表,REF Qty_Sold

採購單表,Re女,Qty_Outstanding

我需要與下列結束:

參考,描述Current_Stock,Qty_Sold,Qty_Outstanding

由於

尼格

+1

您使用的是什麼RDBMS。是否在所有4個表中都提供了唯一的產品ID? – 2013-04-05 11:26:19

回答

1

也許,這樣做的最簡單,最直接的方法是將左加入所有細節表到Product表,然後篩選出具有沒有匹配的所有產品。

所以,這將基本上@ Santhosh的一個小調整溶液(強調):

SELECT 
    pr.Ref, 
    pr.Description, 
    st.Current_Stock, 
    sa.Qty_Sold, 
    po.Qty_Outstanding 
FROM Product pr 
LEFT JOIN Stock st ON st.Ref = pr.Ref 
LEFT JOIN Sales sa ON sa.Ref = pr.Ref 
LEFT JOIN POs po ON po.Ref = pr.Ref 
WHERE st.Ref IS NOT NULL OR sa.Ref IS NOT NULL OR so.Ref IS NOT NULL 
; 

還有一個不那麼明顯的替代:工會的所有詳細信息表,然後轉動詳細數據。結果集僅包含對至少包含一些詳細信息的產品的引用。因此,您可以將結果集內部加入Product以訪問輸出的產品說明。

如果你的SQL產品支持PIVOT子句中,你可以做這樣的:

SELECT 
    p.Ref, 
    p.Description, 
    s.Current_Stock, 
    s.Qty_Sold, 
    s.Qty_Outstanding 
FROM (
    SELECT 
    Ref, 
    Current_Stock, 
    Qty_Sold, 
    Qty_Outstanding 
    FROM (
    SELECT 
     Ref, 
     'Current_Stock' AS Attribute, 
     Current_Stock AS Value 
    FROM Stock 
    UNION ALL 
    SELECT 
     Ref, 
     'Qty_Sold', 
     Qty_Sold 
    FROM Sales 
    UNION ALL 
    SELECT 
     Ref, 
     'Qty_Outstanding', 
     Qty_Outstanding 
    FROM POs 
) d 
    PIVOT (
    SUM(Value) FOR Attribute IN (
     Current_Stock, 
     Qty_Sold, 
     Qty_Outstanding 
    ) 
) p 
) s 
INNER JOIN Product p ON p.Ref = s.Ref 
;

還有迴轉的老年人和更普遍的方法,爲此,你需要使用分組和有條件聚集:

SELECT 
    p.Ref, 
    p.Description, 
    SUM(CASE Attribute WHEN 'Current_Stock' THEN d.Value END) AS Current_Stock, 
    SUM(CASE Attribute WHEN 'Qty_Sold'  THEN d.Value END) AS Qty_Sold, 
    SUM(CASE Attribute WHEN 'Qty_Outstanding' THEN d.Value END) AS Qty_Outstanding 
FROM (
    SELECT 
    Ref, 
    'Current_Stock' AS Attribute, 
    Current_Stock AS Value 
    FROM Stock 
    UNION ALL 
    SELECT 
    Ref, 
    'Qty_Sold', 
    Qty_Sold 
    FROM Sales 
    UNION ALL 
    SELECT 
    Ref, 
    'Qty_Outstanding', 
    Qty_Outstanding 
    FROM POs 
) d 
INNER JOIN Product p ON p.Ref = d.Ref 
GROUP BY 
    p.Ref, 
    p.Description 
;
+0

謝謝Andriy,我選擇使用左連接和where子句 – nig 2013-04-06 13:29:22

0
SELECT P.REF, P.DESCRIPTION, S.CURRENT_STOCK, SALES.QTY_SL, POS.QTY_OUTSTANDING 
FROM PRODUCTS P 
LEFT JOIN STOCK S 
ON S.REF = P.REF 
LEFT JOIN SALES SALES 
ON SALES.REF = P.REF 
LEFT JOIN POS 
ON POS.REF = P.REF 
+0

使用左外部聯接會給我產品表中所有關於我是否在其他表中有記錄的所有信息。我想忽略三個表格(股票,銷售,採購訂單)中沒有任何相關記錄的產品。也許我需要一個WHERE子句? – nig 2013-04-05 11:39:10

+0

在查詢中使用內部聯接而不是左側關鍵字。 – Santhosh 2013-04-05 12:16:14

+0

不幸的是INNER JOIN's只會返回每張表有每個參考數據的記錄:http://sqlfiddle.com/#!6/05768/5 – nig 2013-04-05 16:10:30

0

假設REF獨特並且使用像外鍵所有表

中也許你可以試試

SELECT pt.REF, pt.DESCRIPTION, st.CURRENT_STOCK, sat.QTY_SOLD, pot.QTY_OUTSTANDING 
FROM PRODUCTTABLE pt 
INNER JOIN STOCKTABLE st 
ON st.REF = pt.REF 
INNER JOIN SALESTABLE sat 
ON sat.REF = pt.REF 
INNER JOIN POSTABLE pot 
ON pot.REF = pt.REF 

我只是喜歡這個Graphical summary of join operations非常有用的!

+0

使用內部聯接只會讓我回到三個表(股票,銷售,採購訂單)都有一個外鍵的地方。 (順便說一下,很好的鏈接) – nig 2013-04-05 11:36:56

+0

產品表中有多少行?與不同的REF? – bAN 2013-04-05 11:39:16

+0

產品表中大約有50萬行。 – nig 2013-04-05 11:51:06