1

私は次のクエリを持っています:

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

行番号2991UniversityID = 2あたりから始まるので、何も得られません。を毎回リセットできるようにしたいと思います。Row_NumberUniversityID

私は次のことを試しました:

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エイリアスにアクセスできないのはなぜですか?

4

2 に答える 2

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の前の最後から2番目に解析されORDER BYます。WHEREの前に処理されますSELECT

于 2013-03-26T19:35:36.377 に答える
1

でパーティションを使用row_number

row_number() over(partition by UniversityID, order by teacherid)
于 2013-08-06T17:35:38.790 に答える