sql для 5 лучших записей из второй таблицы в двух соединенных таблицах - PullRequest
1 голос
/ 13 апреля 2011

у меня есть 2 таблицы.student и student_records.

таблица ученика имеет S_id и внешний ключ в student_records.

При объединении этих таблиц мне понадобится 1 идентификатор студента и 5 лучших записей из таблицы student_records для этогоИдентификатор студента.

1 abc 
1 dedw
..
..
2 def 
2 referf
1 из таблицы ученика, 'abc','dedw' и т.д. из student_records Также в таблице ученика есть поле Active.Если Active = 1, тогда показать 5 лучших записей из student_records, в противном случае, если Active = 0, просто есть 1 строка студента

Ответы [ 2 ]

5 голосов
/ 13 апреля 2011

Предполагается, по крайней мере, SQL Server 2005:

SELECT S_id, SomeColumn
    FROM (SELECT s.S_id, sr.SomeColumn,
                 ROW_NUMBER() OVER (PARTITION BY s.S_id ORDER BY sr.SomeColumn) AS RowNum
              FROM student s
                  LEFT JOIN student_records sr
                      ON s.S_id = sr.S_id
                          AND s.Active = 1
          ) t
    WHERE t.RowNum <= 5

Это также может быть записано с использованием CTE .

with cteRowNum as (
    SELECT s.S_id, sr.SomeColumn,
           ROW_NUMBER() OVER (PARTITION BY s.S_id ORDER BY sr.SomeColumn) AS RowNum
        FROM student s
            LEFT JOIN student_records sr
                ON s.S_id = sr.S_id
                    AND s.Active = 1
)
SELECT S_id, SomeColumn
    FROM cteRowNum
    WHERE RowNum <= 5
2 голосов
/ 13 апреля 2011
Select ...
From student As S
    Outer Apply (
                Select Top 5 ...
                From student_records As R1
                Where R1.student_id = S.S_id
                    And S.Active = 1
                Order By ??? -- never mentioned in the OP
                Union All
                Select TOP 1 ...
                From student_records As R1
                Where R1.student_id = S.S_id
                    And S.Active = 0
                Order By ??? -- never mentioned in the OP
                ) As R

Я использовал Outer Apply здесь, потому что предположил, что у вас может быть ситуация, когда у вас есть студент без строк student_record.Кроме того, вы не указали правила, по которым определяется «TOP 5» или «TOP 1».Как мне упорядочить строки в student_records, чтобы определить «TOP 5»?

...