2013-03-26 3 views
1

У меня есть следующий запрос:SQL Server ROW_NUMBER поведение

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 начинается вокруг строки числа . Я хотел бы иметь возможность сбросить 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 

Я получаю

Msg 207, уровень 16, состояние 1, строка 4 Недопустимое имя столбца «RowNum».

Что не так с моим выбором? Почему я не могу получить доступ к псевдониму RowNum?

ответ

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.

+0

Спасибо, я уже имел ИНЕКЕ внутри внутреннего выбора, но я не заметил, я также имел пункт или который заставляющий выберите принести UniversityID = 1 и 2 (из-за ИЛИ). –

1

Использование раздела на row_number:

row_number() over(partition by UniversityID, order by teacherid) 
Смежные вопросы