2016-06-27 15 views
1

Ich versuche, einen Parameter einer Tabelle als Kriterium für sich selbst zu verwenden, und kann meine SQL-Anweisung nicht richtig erhalten. Es scheint eine relativ einfache Abfrage zu sein; Ich verwende eine Unterabfrage für meine Kriterien, aber es filtert keine anderen Zeilen in meiner Tabelle aus.SQL: Verwenden einer Tabelle als Kriterium für sich selbst

Hintergrund:

Fertigung Produktionshalle: Ich habe eine Reihe von Maschinisten auf ihre Maschinen jetzt eine Operation (OprSeq) eines Auftrags (JobNum) ausgeführt wird. Von der LaborDtl-Tabelle, die alle Arbeitsaktivitäten aufzeichnet, kann ich sehen, welche Arbeit gerade aktiv ist (ActiveTrans = 1). Mit diesem Kriterium der aktiven Arbeit möchte ich alle früheren Arbeitsverhältnisse bei jedem aktiven Arbeitseinsatz zusammenfassen. Also brauche ich eine LaborDtl Tabelle der inaktiven Arbeitstätigkeit mit den Kriterien der aktiven Arbeit aus der gleichen Tabelle.

Der Code:

Heres subquery meine 'Kriterien':

SELECT 
    LaborDtl.JobNum, 
    LaborDtl.OprSeq 

    FROM Erp.LaborDtl 

    WHERE LaborDtl.ActiveTrans = 1 

Welche aktiven Transaktionen gibt, ist hier das erste Paar (von Job sortiert):

Job  Operation 
000193 90 
000457 70 
000457 70 
020008-1 140 
020008-2 130 
020010 60 
020035 130 
020175 40 
020175-2 50 
020186 80 
020199 10 
020203 50 
020212 40 
020258 60 
020272 10 
020283 30 
020298 10 
020299 30 

Dann Hier ist die vollständige SQL-Anweisung mit der obigen Abfrage eingebettet:

Ich erwarte, dass nur die Job- und Vorgangsnummern in meiner Unterabfrage angezeigt werden, aber ich erhalte sowohl Aufträge als auch Vorgänge, die in meiner Unterabfrage nicht vorhanden sind. Hier sind die ersten 10 (beachten Sie, das erste JobNum 000.193 pro meine Kriterien sein sollte)

JobNum Op Total Labor 
      0 0.00000000 
    000004 1 32.00000000 
    000019 1 106.00000000 
    000029 1 175.00000000 
    000143 1 85.00000000 
    000164 1 58.00000000 
    000181 1 500.00000000 
    000227 1 116.00000000 
    000421 1 154.00000000 
    000458 1 67.00000000 

Antwort

0

Sie verpassen eine Bedingung, um die äußeren und inneren Fragen miteinander zu verknüpfen. Ohne dieses Kriterium gibt die innere Abfrage gerade "true" zurück, da es Jobs mit aktiven Aktivitäten gibt und somit alle Zeilen in der äußeren Abfrage zurückgegeben werden. Beachten Sie, dass Sie Aliase zu den Tabellen hinzufügen müssen, als die innere und die äußere Abfrage die gleiche Tabelle:

SELECT a.JobNum, a.OprSeq as "Op", SUM(a.LaborQty) as "Total Labor" 
FROM  Erp.LaborDtl a 
WHERE EXISTS (SELECT * -- The select list doesn't really matter here 
       FROM Erp.LaborDtl b 
       WHERE a.JobNum = b.JobNum AND -- Here! 
         a.OprSeq = b.OprSeq AND -- And here! 
         b.ActiveTrans = 1 -- Labor table of just current activity 
       ) 
GROUP BY a.JobNum, a.OprSeq 

Beachten Sie jedoch, dass es eine einfachere (IMHO) Art und Weise. Da Sie von JobNum und OprSeq trotzdem sind die Gruppierung, könnten Sie einfach die Anzahl der aktiven Transaktionen zählen und eine having Klausel diejenigen abzufragen nur die mindestens eine aktive Transaktion haben:

SELECT JobNum, OprSeq as "Op", SUM(LaborQty) as "Total Labor" 
FROM  Erp.LaborDtl 
GROUP BY JobNum, OprSeq 
HAVING COUNT(CASE ActiveTrans WHEN 1 THEN 1 END) > 0 
+1

Super! Tolle Erklärung, ich wusste nicht, dass ich mich der verschachtelten Unterabfrage anschließen muss. Aber ich mag deine alternative Lösung noch besser! Ich habe noch die "Having" -Anweisung, ein weiteres Wort für den SQL-Tool-Gürtel - Danke für den Tipp. –

0

Ohne zu wissen, RDBMS-Anbieter und Version ist dies das beste was ich tun kann:

SELECT 
    t1.JobNum, 
    t1.OprSeq as "Op", 
    SUM(t1.LaborQty) as "Total Labor" 
FROM Erp.LaborDtl t1 
    WHERE EXISTS 
    (
    SELECT 1 
    FROM Erp.LaborDtl t2  
    WHERE t2.ActiveTrans = 1 --Labor table of just current activity 
    and t2.Company = t1.Company 
    and t2.JobNum = t1.JobNum 
    and t2.OprSeq = t1.OprSeq  
    ) 
GROUP BY t1.JobNum, t1.OprSeq 
+1

, dass es auf den Nagel getroffen, Ich habe nur die Bedingungen nicht eingeschlossen, die die innere und die äußere Abfrage miteinander verbinden würden. Danke für deinen Rat! –