sql为两个连接表中第二个表的前5个记录

时间:2011-04-12 21:34:18

标签: sql-server tsql greatest-n-per-group

我有两张桌子。 studentstudent_records

学生表有S_id,并且在student_records中有外键。

在加入这些表格时,我需要1个学生ID和来自student_records表的前5个记录,以获取该学生证。

1 abc 
1 dedw
..
..
2 def 
2 referf
1来自学生表,'abc','dedw'等来自student_records 学生表中还有一个Active字段。如果Active = 1则显示来自student_records的前5条记录,如果Active = 0,则只有1行studentntid

2 个答案:

答案 0 :(得分:5)

至少假设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

答案 1 :(得分:2)

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

我在这里使用了外部申请,因为我认为你可能有一个学生没有student_record行的情况。此外,您尚未指定确定“TOP 5”或“TOP 1”的规则。我应该如何在student_records中订购行以确定“TOP 5”?