student
和student_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
答案 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”?