2016-05-11 7 views
0

Also diese Verwendung:SQL - Nur will ein durch Rekord gruppierte, wenn ein Feld nur ein bestimmte Wert ist und nicht existiert als einen anderen Wert

SELECT FacFirstName, FacLastName, FacDept, OffTerm 
FROM Faculty, Offering 
WHERE Faculty.FacSSN=Offering.facSSN 
GROUP BY FacFirstName, FacLastName, FacDept, OffTerm 

Ich bin in der Lage, dies zu erhalten:

enter image description here

Ich möchte alle Menschen, die 'Winter' in offTerm und nirgendwo sonst haben. Also ich möchte die 2. Reihe und die letzte Reihe. Ich nicht Nicki (2. letzte Zeile) wollen, weil sie

einen Datensatz mit einem offTerm von ‚SPRING‘ aswell als ‚Winter‘ hat

Mein Zug von obwohl hat mich führen zu glauben, dass vielleicht muss ich die Ereignisse zählen von einem Tisch nur mit Winter und vergleichen Sie sie mit einem Tisch, der alles außer Winter hat. Wenn der Datensatz in der Wintertabelle 1 ist und der Datensatz in der anderen Tabelle nicht existiert, dann besorge es. Ich bin mir nicht sicher, wie ich das machen soll.

+0

ich Zugang mit M. Ich entfernte MySql mein schlechtes –

Antwort

0

Versuchen Sie folgendes:

SELECT FacFirstName, FacLastName, FacDept 
FROM Faculty 
INNER JOIN Offering 
    ON Faculty.FacSSN = Offering.facSSN 
GROUP BY FacFirstName, FacLastName, FacDept 
HAVING COUNT(CASE WHEN OffTerm <> 'WINTER' THEN 1 END) = 0 

Wenn OffTerm nicht NULL sein kann, dann ist die obige Abfrage die gewünschten Ergebnisse werden zurückkehren. Ansonsten sollten Sie den folloing auf die HAVING-Klausel der Abfrage hinzu:

AND COUNT(CASE WHEN OffTerm = 'WINTER' THEN 1 END) > 0 

Hinweis: sollten Sie prüfen, zu Verwendung moderner Schalen, explizite Join-Syntax, wie in der Abfrage oben.

+0

Ich benutze Zugang, also bin ziemlich sicher, dass meine Syntax für das, was du getan hast, HAVING COUNT ist (switch (OffTerm <> 'WINTER', 1, true, 0)) = 0 Dies ergab keine Datensätze –

+0

@ user2436807 Ich verstehe nicht, hat die Abfrage, die ich vorschlagen Arbeit, oder nicht? –

+0

Nein, es hat mein Problem nicht gelöst. Es lief, aber gab eine leere Tabelle zurück –

0

Sie können dies versuchen.

select * from (select FacFirstName,FacSSN,count (OffTerm) from (
SELECT FacFirstName, FacLastName,Faculty.FacSSN,FacDept, OffTerm 
FROM Faculty, Offering 
WHERE Faculty.FacSSN=Offering.facSSN 
) AS T GROUP BY FacFirstName, FacSSN having count=1) AS K join Offering AS O on K.FacSSN=O.FacSSN where O.OffTerm='WINTER' 
+0

select * from (select FacFirstName, FacSSN, count (OffTerm) aus ( SELECT FacFirstName , FacLastName, Faculty.FacSSN, FacDept, OffTerm FROM Fakultät, Angebot WHERE Faculty.FacSSN = Offering.facSSN ) AS T GROUP BY FacFirstName, FacSSN mit count (offTerm) = 1) AS K INNER JOIN Angebot AS O on K .FacSSN = O.FacSSN wo O.OffTerm = 'WINTER' –

+0

Ich habe diese Änderungen vorgenommen, um es zu starten: count (offTerm) = 1 und K INNER JOIN OFFERING. Es würde nicht ohne diese Änderungen laufen. Dies gab mir nicht das gewünschte Ergebnis. –

+0

Hallo user2436807, Könnten Sie mir sagen, welche Ausgabe diese Abfrage gab ?? Laut mir sollte es den zweit- und vorletzten Rekord geben. –

0

Dies ist die Lösung:

SELECT table1.FacLastName, table1.FacFirstName, table1.FacDept 
FROM (

SELECT FacFirstName, FacLastName, FacDept, Count(OffTerm) AS termCount 
FROM Faculty, Offering 
WHERE Faculty.FacSSN=Offering.facSSN 
GROUP BY FacFirstName, FacLastName, FacDept 

) AS table1 INNER JOIN (

SELECT FacFirstName, FacLastName, FacDept, Count(OffTerm) AS termCount 
FROM Faculty, Offering 
WHERE Faculty.FacSSN=Offering.facSSN 
GROUP BY FacFirstName, FacLastName, FacDept, Offterm 
HAVING offTerm = 'WINTER' 

) as table2 
ON table1.FacFirstName = table2.facFirstName AND 
table1.FacLastName = table2.facLastName AND 
table1.FacDept = table2.FacDept AND 
table1.termCount = table2.termcount