2014-06-19 53 views
1

我有以下表結構。複雜的外部連接條件

邏輯:如果一個工廠部件編號組合,SumQty如果在@MHL表中有一個條目,則應該進行檢驗。

  1. 我需要列出廠 「11」 和值和 「DEF」 部分號碼組合,我需要列出的總和爲50

CODE

DECLARE @MHL TABLE (LineNumber VarCHAR(5), PartNumber VARCHAR(10), Qty INT) 


INSERT INTO @MHL VALUES ('10001','ABC',10) 
INSERT INTO @MHL VALUES ('10002','ABC',100) 
INSERT INTO @MHL VALUES ('10003','DEF',50) 
INSERT INTO @MHL VALUES ('10005','KXY',25) 
INSERT INTO @MHL VALUES ('10006','KXY',30) 


DECLARE @MHP TABLE (PlantCode VarCHAR(5), LineNumber VARCHAR(5)) 
INSERT INTO @MHP VALUES ('20','10001') 
INSERT INTO @MHP VALUES ('21','10002') 
INSERT INTO @MHP VALUES ('80','10005') 
INSERT INTO @MHP VALUES ('80','10006') 


DECLARE @MasterPLantParts TABLE (PlantCode VarCHAR(5), PartNumber VARCHAR(10)) 

INSERT INTO @MasterPLantParts VALUES ('20','ABC') 
INSERT INTO @MasterPLantParts VALUES ('21','ABC') 
INSERT INTO @MasterPLantParts VALUES ('96','ABC') 
INSERT INTO @MasterPLantParts VALUES ('11','DEF') 
INSERT INTO @MasterPLantParts VALUES ('80','KXY') 


SELECT M.PlantCode,M.PartNumber,SumQty 
FROM @MasterPLantParts M 
LEFT OUTER JOIN 
    (SELECT PartNumber, PlantCode, SUM(Qty) SumQty 
    FROM @MHL H 
    LEFT OUTER JOIN @MHP p 
     on P.LineNumber = H.LineNumber 
    GROUP BY PartNumber, PlantCode 
    )T 
ON T.PartNumber = M.PartNumber 
AND T.PlantCode = M.PlantCode 

CURRENT RESULT

enter image description here

預期的結果

enter image description here

問題

的QtySum 「50」 現在不來了。如何在SQL Server 2005中做到這一點?如果該方法可以在Oracle 8i中運行,那也是很好的

注意:即使@MHP中沒有記錄,我也需要從@MHL中獲得總和。但是,如果@MHP中有一個值,請從@MHP獲取關聯值,@MHL關係

+0

你能解釋一下邏輯嗎?爲什麼「11」和「DEF」是50,而「96」和「ABC」是0? – cha

+1

如果執行以下語句,DEF的值將會出現:'INSERT INTO @MHP VALUES('11','10003')' – cha

+0

@cha是正確的,你在PlantCode和LineNumber之間沒有關係,所以沒有辦法通過任何連接讓SQL獲得Part/Qty,除非以QTY開始並解決,否則PlantCode將爲NULL。 – JiggsJedi

回答

1

編輯

下面的查詢(這是比我第一個發佈更簡單)會得到你想要的結果。首先,選擇MasterPLantParts的所有行(使用LEFT OUTER JOIN)。然後,加入MHL。如果MHP中沒有特定工廠的條目,那麼MHL的所有生產線都將被選定爲工廠)。

select 
    mpp.PlantCode PlantCode, 
    mpp.PartNumber PartNumber, 
    sum(MHL.Qty) as SumQty 
from MasterPLantParts mpp 
left outer join MHP on mpp.PlantCode = MHP.PlantCode 
inner join MHL on MHL.LineNumber = MHP.LineNumber or (mpp.PartNumber = MHL.PartNumber and MHP.LineNumber is null) 
group by mpp.PlantCode, mpp.PartNumber 
order by mpp.PlantCode, mpp.PartNumber; 

SQL Fiddle demo

的Oracle 8i的語法

select 
    mpp.PlantCode PlantCode, 
    mpp.PartNumber PartNumber, 
    sum(MHL.Qty) as SumQty 
from MasterPLantParts mpp, MHP, MHL 
where mpp.PlantCode = MHP.PlantCode(+) 
and (MHL.LineNumber = MHP.LineNumber or (mpp.PartNumber = MHL.PartNumber and MHP.LineNumber is null)) 
group by mpp.PlantCode, mpp.PartNumber 
order by mpp.PlantCode, mpp.PartNumber; 

參考

Oracle SQL*Plus Pocket Reference

+0

您是否可以幫助Oracel 8i查詢,以便我可以將其標記爲答案? – Lijo

+0

您是否收到Oracle 8i的錯誤消息?我沒有它,但這似乎是基本的SQL應該工作。 – Chipmonkey

+0

@Lijo請檢查上面關於Oracle 8i語法的更新答案。 –

0

我沒有在任何dbms上測試過它,但它應該可以在它們兩個上進行小的修復。

select PlantCode, PartNumber, sum(qty) 
from (
    select x.PlantCode, x.PartNumber, y.Qty 
    from MasterPLantParts x 
    join MHL y 
     on x.PartNumber = y.PartNumber 
    left join MHP z 
     on x.PlantCode = z.PlantCode 
    where z.PlantCode is null 
    union 
    select x.PlantCode, x.PartNumber, z.Qty 
    from MasterPLantParts x 
    join MHP y 
     on x.PlantCode = y.PlantCode 
    join mhl z 
     on y.LineNumber = z.LineNumber 
) as T 
group by PlantCode, PartNumber; 

PLANTCODE PARTNUMBER 3   
--------- ---------- ----------- 
11  DEF     50 
20  ABC     10 
21  ABC    100 
80  KXY     55 
96  ABC    110 
0
INSERT INTO @MHP VALUES ('91','what ever line number you wan to go here') 
INSERT INTO @MHP VALUES ('11','what ever line number you wan to go here') 

有了這些值MHP你將永遠有空值,因爲這是左外連接什麼是該做的。