2017-05-01 8 views
1

結果が500Kを超えるクエリを持つ。私がしたいのは、これらを100Kの結果で分割することです。私はしかし、それを支援するために行番号列を作成し、今私はそれを参照してるというのが私のそれは機能を処理して、このエラーを取得維持しませんWHEREでROW_NUMBER()を参照する場合

メッセージ4108、レベル15、状態1、 Line 1 ウィンドウ関数は、SELECT句またはORDER BY句にのみ表示できます。参照用

問合せ:

1 SELECT 
2 mt.Name, 
3 mt.IDNO, 
4 so.IDType, 
5 Row = ROW_NUMBER()OVER(ORDER BY mt.Name) 
6 
7 FROM   MainTable  mt WITH(NOLOCK) 
8 LEFT JOIN SupportTable1 so WITH(NOLOCK) ON so.Name = mt.Name 
9 LEFT JOIN SupportTable2 st WITH(NOLOCK) ON st.Name = mt.Name 
10 
11 WHERE 1=1 
12 AND  ROW_NUMBER()OVER(ORDER BY mt.Name) BETWEEN '1' and '100000' 
Msg 4108, Level 15, State 1, Line 12 Windowed functions can only 
appear in the SELECT or ORDER BY clauses. 

これを使用するか、それは私が必要なものを私に与えることができ探求する別のオプションがあるために私は何をしますか?

ありがとうございました。

+1

あなたはMySQLを使用していません。コードは明らかにSQL Serverです。 –

+0

NOLOCKヒントを使用してすべてのクエリを浪費する前に、この記事をチェックしてください。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

答えて

3

あなたはMySQLを使用していません。これを行うためには、CTEまたはサブクエリを使用します。

SELECT s.* 
FROM (SELECT mt.Name, mt.IDNO, so.IDType, Row = ROW_NUMBER() OVER (ORDER BY mt.Name) 
     FROM MainTable mt LEFT JOIN 
      SupportTable1 so 
      ON so.Name = mt.Name LEFT JOIN 
      SupportTable2 st 
      ON st.Name = mt.Name 
    ) s 
WHERE Row BETWEEN 1 and 100000; 

注:

  • ウィンドウ関数はWHERE句で使用することはできません。
  • WHERE句にも列エイリアスを使用できません。そのため、CTEまたはサブクエリが必要です。
  • 整数定数を一重引用符で囲んではいけません。

代わりに、あなただけのTOPを使用することができます。

 SELECT TOP (100000) mt.Name, mt.IDNO, so.IDType, Row = ROW_NUMBER() OVER (ORDER BY mt.Name) 
     FROM MainTable mt LEFT JOIN 
      SupportTable1 so 
      ON so.Name = mt.Name LEFT JOIN 
      SupportTable2 st 
      ON st.Name = mt.Name 
     ORDER BY Row; 
0

のSQL Server 2012以降では、NEXTをOFFSETとFETCH ORDER BY句に追加されました。

SELECT mt.Name, mt.IDNO, so.IDType 
FROM MainTable mt WITH(NOLOCK) 
LEFT JOIN SupportTable1 so WITH(NOLOCK) ON so.Name = mt.Name 
LEFT JOIN SupportTable2 st WITH(NOLOCK) ON st.Name = mt.Name 
ORDER BY mt.Name OFFSET 0 ROWS FETCH NEXT 100000 ROWS ONLY; 

次に、各新しい反復でオフセット番号に100000を追加します。

関連する問題