我有以下查询:
SELECT * FROM
(
SELECT
a.TeacherID, a.UniversityID,
ROW_NUMBER() OVER (ORDER BY a.TeacherID) AS RowNum
FROM
SelectAll a
LEFT JOIN
mp_Ratings r ON a.TeacherID = r.TeacherID
GROUP BY
a.TeacherID, a.UniversityID
) AS TeacherInfo
WHERE RowNum BETWEEN 10 AND 50
它工作正常。现在,如果我想做类似的事情:
SELECT * FROM
(
SELECT
a.TeacherID, a.UniversityID,
ROW_NUMBER() OVER (ORDER BY a.TeacherID) AS RowNum
FROM
SelectAll a
LEFT JOIN
mp_Ratings r ON a.TeacherID = r.TeacherID
GROUP BY
a.TeacherID, a.UniversityID
) AS TeacherInfo
WHERE RowNum BETWEEN 10 AND 50 AND UniversityID = 2
我什么也没得到,因为UniversityID = 2
开始于行号 2991 。我希望能够使用每个不同的Row_Number
重置UniversityID
。
我尝试了以下内容:
SELECT *, ROW_NUMBER() OVER (ORDER BY TeacherID) AS RowNum
FROM
(
SELECT
a.TeacherID, a.UniversityID
FROM
SelectAll a
LEFT JOIN
mp_Ratings r ON a.TeacherID = r.TeacherID
GROUP BY
a.TeacherID, a.UniversityID
) AS TeacherInfo
WHERE UniversityID = 2
为每次搜索带来了新的row_numbers
,但如果我尝试使用RowNum
别名:
SELECT *, ROW_NUMBER() OVER (ORDER BY TeacherID) AS RowNum
FROM
(
SELECT
a.TeacherID, a.UniversityID
FROM
SelectAll a
LEFT JOIN
mp_Ratings r ON a.TeacherID = r.TeacherID
GROUP BY
a.TeacherID, a.UniversityID
) AS TeacherInfo
WHERE UniversityID = 2
AND RowNum BETWEEN 10 AND 20
我得到了
消息207,级别16,状态1,行4无效的列名称'RowNum'。
我的选择有什么问题?为什么我无法访问RowNum
别名?
答案 0 :(得分:5)
您只需将WHERE
子句移动到内部查询。
SELECT TeacherID, UniversityID, RowNum FROM
(
SELECT a.TeacherID, a.UniversityID, ROW_NUMBER() OVER
(ORDER BY a.TeacherID) AS RowNum FROM SelectAll a
LEFT JOIN mp_Ratings r
ON a.TeacherID = r.TeacherID
WHERE UniversityID = 2
GROUP BY a.TeacherID, a.UniversityID
) as TeacherInfo WHERE RowNum BETWEEN 10 AND 50;
您无法访问查询外部版本中的RowNum
别名,因为别名尚不存在。在SELECT
之前,ORDER BY
被解析为倒数第二。在WHERE
之前处理SELECT
。
答案 1 :(得分:1)
在row_number
上使用分区:
row_number() over(partition by UniversityID, order by teacherid)