2011-04-12 49 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」?

相關問題