2016-04-29 52 views
0

設置數據字段:創建一個包含2個不同領域的基於條件SQL

我的數據庫有3個表,我需要的工作。我們稱前兩個PartListPartHistPartList包含所有在機器上的零件號(我們稱之爲ExpectedPart)。 PartHist包含所有已驗證在機器上的組件(VerifiedPart)。兩個表都包含引用特定物理機器的MachineID字段。

到目前爲止,我的查詢如下所示:

SELECT 
    ExpectedPart, 
    VerifiedPart 
FROM 
    PartList List 
    LEFT OUTER JOIN PartHist Hist 
ON 
    List.MachineID = Hist.MachineID 
    AND List.ExpectedPart = Hist.VerifiedPart 
Where 
    List.MachineID = 'SomeID' 

問題:

到目前爲止,這個查詢的工作非常漂亮,告訴哪些組件尚未得到驗證,作爲值的VerifiedPartNULL,直到該部分已被驗證。除了在一個特定的部分,其中零件編號在PartList,但其驗證存儲在另一個表(不是我的錯)。因此,即使在驗證之後,該部分的查詢也會返回NULL

這個第三個表格,我們稱之爲SpecialCase,有MachineIDVerifiedPartSP字段。 PartHist表中還有一個字段,如果零件是此特例零件的實例,則包含'Y',如果不是,則爲'N'。該字段將被稱爲SpYesNo

問題: 我可以在查詢中創建一個包含所有已驗證零件的字段嗎?我想在某種程度上有可能是使用,這樣的條件的方式...

IF (PartHist.SpYesNo = 'Y') THEN use SpecialCase.VerifiedPartSP as VerifiedPart 

我使用的是IBM DB2數據庫

回答

1

你可以聯合你的兩個「已驗證」部分表一起,然後加盟:

SELECT 
    ExpectedPart, 
    VerifiedPart 
FROM 
    PartList List 
    LEFT OUTER JOIN 
     ( 
      SELECT machineid, verifiedpart FROM PartHist 
      UNION 
      SELECT machineid, verifiedpartsp FROM SpecialCase 
     )Hist 
ON 
    List.MachineID = Hist.MachineID 
    AND List.ExpectedPart = Hist.VerifiedPart 
Where 
    List.MachineID = 'SomeID' 

你也可以LEFT OUTER JOIN到這兩個表,並使用CASE語句來檢查任何領域,但我認爲這種做法更符合您的要求,並會執行得更快。


這是一個帶聯接和CASE語句版本弄清楚什麼是什麼:

SELECT 
    ExpectedPart, 
    CASE WHEN PartHist.SPYesNo = 'Y' THEN SpecialCase.VerifiedPartSP ELSE partHistVerifiedPart END as VerifiedPart 
FROM 
    PartList List 
    LEFT OUTER JOIN PartHist ON 
     List.MachineID = PartHist.MachineID AND 
     List.ExpectedPart =   PartHist.VerifiedPart 
    LEFT OUTER JOIN SpecialCase ON 
     List.MachineID = SpecialCase.MachineID AND 
     List.ExpectedPart = SpecialCase.VerifiedPart 

Where 
    List.MachineID = 'SomeID' 
+0

嘗試過這一點,但似乎我們的數據庫不支持UNION(或展櫃,我們的查詢經歷不會允許) – corbfon

+0

CASE聲明立即生效。謝謝! – corbfon

-1
SELECT DECODE(VerifiedPart, NULL, ExpectedPart, 
       VerifiedPart) as ValidPart 
FROM 
    PartList List 
    LEFT OUTER JOIN PartHist Hist 
ON 
    List.MachineID = Hist.MachineID 
    AND List.ExpectedPart = Hist.VerifiedPart 
Where 
    List.MachineID = 'SomeID' 
+0

請評論爲什麼解決方案不正確。我想了解更多。謝謝。 –

+0

沒有降票,但有幾個問題給你。你在SELECT語句的末尾有「ValidPart」,我假設你的意思是別的,但不完全確定是什麼。此外,根據讀取DECODE的描述,這將查看VerifiedPart列,如果爲NULL,則將用ExpectedPart替換該值。否則,該值將保留爲原始的VerifiedPart值。由於這不能訪問SpecialCase的VerifiedPart值,我不明白它是如何解決問題的 – corbfon

+0

我剛使用ValidPart作爲別名。你需要有一個名字,否則它會作爲整個解碼語句輸出。我不清楚特殊箱的價值是什麼。這只是你想要的輸出中的東西嗎? –

相關問題