11

SQL クエリに問題があります

DISTINCT StudentGroups(SG) を選択したいのですが、クエリでいくつかの繰り返しが表示されます

ここに私のクエリがあります

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

更新しました

このクエリにより、次のデータが得られます

ここに画像の説明を入力

しかし、SGIDを繰り返したくない

4

2 に答える 2

15

DISTINCT返されるすべての列に常に適用されます。1 つの列を括弧で囲んでも、その動作に違いはありません。

結果に の一意の値のみを含めたい場合は、代わりに句SG.GIDを使用できますが、他の列で返す値についていくつかの規則を決定する必要があります。、、、などの集計関数を使用してこれを行います。簡略化した例:GROUP BYMIN()MAX()COUNT()SUM()

SELECT  SG.SGID,
        MIN(SG.START_TIME),              --the lowest start time for this sgid.
        COUNT(DISTINCT en.EnrollmentID)  --the unique enrollments for this sgid.
    FROM StudentGroups SG 
    INNER JOIN Enrollments EN ON SG.SGID = EN.SGID
    GROUP BY SG.SGID;

元のクエリのように複数のテーブルを結合する場合、結合による重複によって誤った結果が生じる可能性があるため、カウントと合計の際には注意が必要です。

別のオプションはROW_NUMBER()、それぞれに対して 1 つの行を返すために使用することSGIDです。

SELECT * FROM (
    SELECT  SG.SGID,
            SG.START_TIME, 
            en.EnrollmentID,
            ROW_NUMBER() OVER (PARTITION BY SGID ORDER BY SG.START_TIME) as RN
        FROM StudentGroups SG 
        INNER JOIN Enrollments EN ON SG.SGID = EN.SGID
    )
    WHERE RN = 1;

これにより、各 の行に番号が付けられますSGID。1 から始まり、 の値でソートされますSG.START_TIME。それぞれの最も早い開始時刻を持つ 1 つの行が返されますSGID。複数の行の開始時刻が同じ場合、それらのいずれかが多かれ少なかれランダムに選択されます。ORDER BY句にさらにフィールドを追加して、返される行をさらに定義できます。

于 2013-02-21T10:19:55.717 に答える
6

DISTINCT が目的の出力に対して機能しない場合は、GROUP BY 句を使用してください。

于 2013-10-09T06:42:01.560 に答える