2016-04-29 2 views
0

Das Setup:Feld mit 2 verschiedenen Feldern Daten basierend auf Bedingung in SQL

Meine Datenbank hat drei Tabellen, die ich brauche, mit zu arbeiten. Lassen Sie uns die ersten beiden PartList und PartHist anrufen. PartList enthält alle Teilenummern, die auf eine Maschine gehen (Wir nennen dieses Feld ExpectedPart). PartHist enthält alle Komponenten, die auf einer Maschine verifiziert wurden (VerifiedPart). Beide Tabellen enthalten ein MachineID-Feld, das auf eine bestimmte physische Maschine verweist.

Bisher sieht meine Frage wie folgt:

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' 

Das Problem:

Bisher diese Abfrage sehr gut funktioniert zu sagen, welche Komponenten noch nicht überprüft worden ist, als der Wert von VerifiedPart ist NULL bis dieser Teil verifiziert wurde. Außer in einem bestimmten Teil, wo die Teilenummer in der PartList ist, aber seine Überprüfung wird in einer anderen Tabelle gespeichert (nicht meine Schuld). Auch nach der Überprüfung gibt die Abfrage NULL für diesen Teil zurück.

Diese dritte Tabelle, wir nennen sie SpecialCase, hat MachineID und VerifiedPartSP Felder. Es gibt auch ein Feld in der Tabelle PartHist, das "Y" enthält, wenn das Teil eine Instanz dieses Sonderfallteils ist, und "N", wenn dies nicht der Fall ist. Dieses Feld wird SpYesNo genannt.

Die Frage: Kann ich ein einzelnes Feld in der Abfrage erstellen, die alle überprüften Teile enthält? Ich dachte, irgendwie könnte es eine Möglichkeit sein, ein Zustand, so dass die Verwendung ...

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

Ich verwende eine IBM DB2-Datenbank

Antwort

1

Sie können nur Gewerkschaft Ihre zwei „Verifiziert“ Teile-Tabellen zusammen, dann beitreten:

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' 

Sie könnten auch LEFT OUTER JOIN zu diesen beiden Tabellen und verwenden Sie eine CASE Anweisung entweder Feld zu überprüfen, aber ich denke, dieser Ansatz besser Ihren Anforderungen entspricht, und wird schneller ausgeführt.


Hier ist eine Version mit einem JOIN und ein CASE-Anweisung, um herauszufinden, was was ist:

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

dies versucht, aber es scheint, dass unsere Datenbank nicht UNION unterstützt (oder Showcase , die unsere Abfragen durchlaufen wird es nicht zulassen) – corbfon

+0

Die CASE-Anweisung funktionierte sofort. Vielen Dank! – 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

Bitte erläutern Sie, warum die Lösung nicht korrekt ist. Ich würde gerne mehr erfahren. Vielen Dank. –

+0

Haben nicht abgestimmt, aber haben ein paar Fragen für Sie. Sie haben "ValidPart" am Ende der SELECT-Anweisung, die Sie als etwas anderes gemeint haben, aber nicht genau, was. Basierend auf dem Lesen der Beschreibung von DECODE würde dies auch die Spalte "VerifiedPart" anzeigen und, falls NULL, den Wert durch "ExpectedPart" ersetzen. Andernfalls würde der Wert als der ursprüngliche Wert von VerifiedPart beibehalten.Da dies nicht auf den VerifiedPart-Wert von SpecialCase zugreift, sehe ich nicht, wie es das Problem löst – corbfon

+0

Ich habe gerade ValidPart als Alias ​​verwendet. Sie müssen einen Namen haben, sonst wird es als die gesamte Dekodierungsanweisung bei der Ausgabe ausgegeben. Ich bin mir nicht sicher, welchen Wert der Sonderfall hat. Ist es nur etwas, was Sie in der Ausgabe wollen? –