2013-03-26 65 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 

我得到

消息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之前。在SELECT之前處理了WHERE。在row_number

+0

謝謝,我已經有了內內選擇一個WHERE子句,但我沒有注意到,我也有過這是導致選擇帶來UniversityID = 1 or子句和2(由於OR)。 – 2013-03-26 19:59:38

1

使用分區:

row_number() over(partition by UniversityID, order by teacherid)