2017-05-10 7 views
1

Ich versuche, alle feeheads auszuwählen, die in st_annual Tabelle nicht existieren die folgende Abfrage verwenden, aber es gibt nur eine Zeile, während ich erwarte, dass zwei Reihen bekommen:LEFT JOIN mit GROUP BY kehrt unerwartetes Ergebnis

SELECT A.* 
FROM hl_annual A 
LEFT JOIN (
     SELECT feeid, regd, class 
     FROM st_annual 
     GROUP BY regd, feeid 
) B ON A.id = B.feeid AND A.class=B.class   
WHERE A.class='4' AND A.session='2' 
AND B.feeid IS NULL 

Bitte sehen Sie sich die fiddle an. Ich erwarte id = 3 und id = 6, aber ich habe nur id = 3.

Ich möchte alle eindeutigen feeid in der Tabelle st_annual auswählen und ich möchte mit der ID in der hl_annual Tabelle vergleichen. Wenn feeid nicht existiert, wenn wir die st_table durch regd und feeid gruppieren, möchte ich diese abwesende Gebührenidentifikation von hl_annual Tabelle bekommen. Also von der Geige bekomme ich nur 3, was nicht in st_annual ist, aber ich möchte auch feeid = 6 bekommen, weil das in einem der regd in st_annual nicht existiert.

+0

Warum brauchen Sie überhaupt eine Gruppe in der Unterabfrage? 6 existiert als ID 37 in Ihren Daten. Warum erwartest du es in deinen Ergebnissen? hl_annual und st_annual beitreten auf Id und feeId 6 besteht in beiden Datensätzen mit hl_annual eine Klasse von 4 (keine Tics sollte verwendet werden) und Sitzung von 2. Da es in beiden besteht und nicht durch Klasse oder Sitzung begrenzt ist die feedID ist nicht null ... also 6 wäre ausgeschlossen. – xQbert

+0

Ich möchte alle eindeutigen feeid in der Tabelle st_annual auswählen und ich möchte mit der ID in der Tabelle hl_annual vergleichen. Wenn feeid nicht existiert, wenn wir die st_table durch regd und feeid gruppieren, möchte ich diese abwesende Gebührenidentifikation von hl_annual Tabelle bekommen. Also von der Geige bekomme ich nur 3, was nicht in st_annual ist, aber ich möchte auch feeid = 6 bekommen, weil das in einem der regd in st_annual nicht existiert. – theJohn

+0

Also ID 6 ist in der Tabelle st_Annual (ID 37) (und in HL_Annual) vorhanden. Dies bedeutet, dass es in beiden ...also sollte es nicht auftauchen. Eine Gruppe ohne Aggregat macht für mich keinen Sinn. – xQbert

Antwort

1

Nach einer Tonne Annahmen ....

Wir brauchen eine Masterliste der Klasse und Gebühr, die vorhanden sein sollten. Zuerst erhalten wir eine eindeutige Liste aus der ST_Annual-Tabelle und treten wieder mit HL_Annual zusammen; aber da dies nicht das regD für jede Klasse enthält, müssen wir uns zurück verbinden, um das regD für jede Klasse zu bekommen. Nun, da wir die Masterliste haben, verbinden wir diese mit ST_Annual zurück, um zu finden, welche fehlen.

SELECT A.*, B.FeeID, c.regd 
FROM HL_ANNUAL A 
LEFT JOIN (SELECT distinct Y.class, FeeID, Z.RegD 
      from ST_ANNUAL Y 
      cross join (Select Distinct regD, Class from st_Annual) Z 
      WHERE Y.Class = Z.Class 
     ) B 
    on A.ID = B.FeeID 
and A.Class = B.Class 
LEFT JOIN ST_ANNUAL C 
    on C.FeeID = B.FeeID 
and C.Class= B.Class 
and C.RegD = B.RegD 
WHERE A.class = 4 
    AND A.session = 2 
    AND C.RegD is null 
Order by A.ID, A.Class 

ich das Gefühl nicht los können wir Tabellen im Zusammenhang mit Klasse, regd sind vermisst, die diese leichter machen würde, insbesondere eine Tabelle, die die Beziehung der Klasse regd ist und vielleicht Sitzung wieder Annahmen Ich mache; für jeden Eintrag.

Da ich nicht SQL FIDDLE arbeiten könnte ... arbeiten ... http://rextester.com/SMG32021

seltsam, dass die Tabellen bereits bestanden ... mit den gleichen Daten ...

Oh .. . und die Ausgabe:

id class session feehead    amount FeeID regd 
    1 3 4  2  Examination Fees 500  NULL NULL 
    2 6 4  2  Sports    1500 6  NULL 

Aber auch hier ich Sie warnen, ich hatte mehrere Annahmen über die Beziehungen zwischen Daten beteiligt Klasse, regd und Sitzung und id/feeid ... wenn meine Annahmen sind falsch zu machen; Wenn Sie die korrekten Ergebnisse hier angeben, werden die korrekten Ergebnisse möglicherweise nicht zurückgegeben, wenn die Daten variieren.

+0

Leeres Ergebnis. :-( – Strawberry

1

Warum würde Verwendung Aggregation verwenden? Hier ist eine Idee: Verwenden Sie not exists. Viel mehr explizit auf Ihre Absicht, und es sollte viel bessere Leistung haben (ein Index für st_annual(fee_id, class) hilft):

SELECT A.* 
FROM hl_annual A 
WHERE A.class = 4 AND A.session = 2 AND 
     NOT EXISTS (SELECT 1 
        FROM st_annual sa 
        WHERE A.id = sa.feeid AND sa.class = B.class 
       ) ;  

Ich bin nicht sicher, dass dies die Logik Problem behebt, aber es ist ein besserer Ort zu starten, für die Problem, nach dem du fragst.

+0

Woher bekommst du B.class? – theJohn

+0

Wenn Sie auf die Geige schauen, löst das das Problem nicht. Die Abfrage in meiner Frage und Ihre Antwort erzeugt das gleiche Ergebnis. – theJohn