我正在尝试使用子查询从SQL Server 2012查询某些数据。我试图获得Sub Query返回的每个Id的前3条记录,但我现在还没有想到如何这样做我写这个查询:
Select * from Student Where TeacherId in (Select TeacherId from Teacher)
我不确定这是否可以通过使用这样的查询来实现,或者我是否必须编写函数或其他任何东西?
对于我糟糕的解释技巧,任何建议都会很棒。
答案 0 :(得分:1)
您应该加入Teacher
到Student
表,然后使用分析函数为每位教师提供第一个记录:
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的结果。