获取每个结果的子查询的有限记录

时间:2018-02-26 06:27:11

标签: sql sql-server-2012

我正在尝试使用子查询从SQL Server 2012查询某些数据。我试图获得Sub Query返回的每个Id的前3条记录,但我现在还没有想到如何这样做我写这个查询:
Select * from Student Where TeacherId in (Select TeacherId from Teacher)
我不确定这是否可以通过使用这样的查询来实现,或者我是否必须编写函数或其他任何东西? 对于我糟糕的解释技巧,任何建议都会很棒。

2 个答案:

答案 0 :(得分:1)

您应该加入TeacherStudent表,然后使用分析函数为每位教师提供第一个记录:

SELECT *
FROM
(
    SELECT
        s.*, t.TeacherId, t.TeacherName,
        ROW_NUMBER() OVER (PARTITION BY t.TeacherId ORDER BY some_col) rn
    FROM Teacher t
    INNER JOIN Student s
        ON t.TeacherId = s.TeacherId
) t
WHERE rn = 3;

我假设您要用于排序的两个表some_col之一中有一列。在没有定义一些排序的情况下谈论前三个记录没有多大意义。

答案 1 :(得分:0)

我想您希望每个ID都有top 3行,而不是整个结果集的top 3

WITH CTE AS
(
    SELECT *,
          ROW_NUMBER() OVER (PARTITION BY t.TeacherId ORDER BY ?) Seq 
    FROM Student s
    INNER JOIN Teacher t ON t.TeacherId = s.TeacherId
)
SELECT * FROM CTE
WHERE Seq between 1 AND 3

?占位符要求column_name生成sequence_number以获得边界为1到3的结果。