Wie man Eindeutige Werte in SQL Abfrage
Ich habe ein problem in meiner SQL-Abfrage
möchte ich select DISTINCT StudentGroups(SG), aber die Abfrage gibt mir einige repetations
hier ist meine Abfrage
SELECT DISTINCT(SG.SGID), en.EnrollmentID, CR.Name AS Course, INS.Name as Instructor,
S.Session, SG.StartTime, SG.EndTime, EN.CreateDate
FROM StudentGroups SG inner JOIN Enrollments EN ON SG.SGID = EN.SGID
JOIN Courses CR ON SG.CourseID = CR.CourseID
JOIN Class CL ON SG.ClassID = CL.ClassID
JOIN Instructors INS ON SG.InstructorID = INS.InstructorID
JOIN Sessions S ON SG.SessionID = S.SessionID
WHERE EN.SGID NOT IN ( SELECT SGID FROM Enrollments
WHERE StudentID = 45
AKTUALISIERT
Diese Abfrage gibt mir folgende Daten
aber ich will nicht wiederholt SGID
DISTINCT
ist nicht eine Funktion. Es ist ein operator angewendet auf alle die Spalten in der select-Liste.- UNTERSCHIEDLICHE arbeiten auf die ganze Zeile: Sie können nicht UNTERSCHIEDLICHE SGID-Werte in der gleichen Ergebnismenge mit anderen Spalten. Es macht keinen Sinn...
- dann wie bekomme ich eindeutige Datensätze?? @a_horse_with_no_name ,@gbn
- Einzigartige nach was? Würde es helfen, wenn Sie zeigte uns ein paar Beispieldaten und das erwartete Ergebnis.
- Was genau erwartest du Ihren Ausgang, hier zu sein? Sie verknüpfen mehrere Tabellen zusammen, so, es sei denn deine Beziehungen zwischen den Tabellen sind alle 1-1, Sie können erwarten, einige Wiederholungen in den resultierenden Datensatz. Wenn Sie könnten ein Beispiel geben, wie Sie möchten, dass Ihre Ausgabe zu sehen, das wäre hilfreich.
- siehe aktualisierte Frage
- siehe aktualisierte Frage
- Sie müssen uns sagen, wie man wählen Sie eine der Zeilen. Wie bestimmen Sie, welche Zeile verworfen werden sollte und welche Sie behalten möchten? Die neuste? Die erste?
- Sie benötigen die EnrollmentID/CreateDate in Ihrem Ergebnis? Wenn ja, sind Sie gehen zu müssen, um entweder Aggregat-diese Werte und verwenden Sie eine GRUPPE, INDEM Sie auf die übrigen Spalten, oder akzeptieren Sie die Wiederholung des SGID, da gibt es mehrere Einträge in der Registrierungs-für jeden StudentGroup.
- Der edit zu deiner Frage nicht helfen. Wenn Sie nicht möchten, SGID wiederholt (aber es gibt mehr als eine Zeile für jeden), welche Kriterien sollten entscheiden, welche Zeilen zeigen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
DISTINCT
bezieht sich immer auf alle Spalten zurückgegeben. Setzen Sie Klammern, um eine Spalte macht keinen Unterschied in seinem Verhalten.Wenn Sie möchten, dass Ihre Ergebnisse enthalten nur eindeutige Werte
SG.GID
verwenden, können Sie einGROUP BY
- Klausel statt-aber dann müssen Sie entscheiden, einige Regeln für die Werte, die Sie zurückgeben möchten in den anderen Spalten. Sie tun dies durch die Verwendung von Aggregat-Funktionen wieMIN()
,MAX()
,COUNT()
,SUM()
usw. Vereinfachtes Beispiel:Beim verknüpfen von mehreren Tabellen, wie in der ursprünglichen Abfrage, die Sie müssen vorsichtig sein, beim zählen und addieren Dinge, die als Duplikate in den join kann es zu falschen Ergebnissen.
Andere Möglichkeit wäre die Verwendung von
ROW_NUMBER()
zurück eine Zeile für jedeSGID
:Diese zahlen der Zeilen für jede
SGID
beginnend bei 1 und sortiert nach dem Wert vonSG.START_TIME
. Wird es wieder die eine Zeile mit der frühesten Startzeit für jedeSGID
. Wenn mehrere Zeilen haben die gleiche start-Zeit, wählen Sie eine beliebige einer von denen, die mehr oder weniger zufällig. Fügen Sie weitere Felder, um dieORDER BY
- Klausel, um weiter zu definieren, welche Zeilen zurückgegeben werden.Bitte verwenden Sie GROUP BY-Klausel, wenn DISTINCT nicht auf die gewünschte Ausgabe.