2011-04-12 76 views
1

我有2个表。 studentstudent_recordsSQL在两个连接表中的第二个表的前5条记录

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

加入这些表格时,我需要1个学生ID和来自student_records表格的前5个记录作为该学生ID。

 
1 abc 
1 dedw 
.. 
.. 
2 def 
2 referf 
1是从学生表和 'abc','dedw'等为 student_records 也有是在学生表中的活动领域。如果主动= 1,那么从别的student_records显示前5记录,如果活动= 0的只是有studentid

+0

MySQL,MS SQL,Oracle? – Jack 2011-04-12 21:37:37

+0

那么我们可以使用像Row_Number这样的分析函数吗? – 2011-04-12 21:37:50

+0

o对不起。 MS SQL。 – lkeo 2011-04-12 21:37:54

回答

5

假设1行至少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
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”?

相关问题