2012-03-07 7 views
4

内で使用させません。のMS SQL ROW_NUMBER()関数は - 私は、次のSQL文を持って、同じ文

$sql = "select siteid, row_number() OVER (ORDER BY siteid) as rownum FROM nwsite WHERE rownum >= 4"; 

「ROWNUM」私は、クエリ(例えば外の名前を使用するときに動作しますforeachループで)、WHERE句として使用すると、決して動作しません。

アイデア?

おかげ

+0

したがって、where節が計算されるまで解析が適用されないため、WHERE節にアナライザを配置することはできません。したがって、サブクエリでラッピングするのが一般的な方法です。 – Glenn

答えて

3

ので、 where句iウィンドウ関数row_numberが計算される前に評価された場合、where句にその列を含めることはできません。

あなたはこのようなクエリ構築することができます(nwsite FROM ROWNUMとしてサイトIDサイトID BY、ROW_NUMBER()OVER(ORDER)を選択)北西から

選択サイトID、ROWNUMをWHERE ROWNUMの> = 4

でこの場合、内部クエリは全体として計算され、次に外側クエリに渡され、そこでrownumカラムが処理されます。

+0

ああ、私は今、大変感謝しています。 – lmpearce1

+1

サブセレクトをしなくても 'having'節はうまくいきませんか? –

+0

@MarcBいいえ、ms sql sucksのため、HAVING句は使用できません。それはMySQLで完璧です。 –

1

はこのようにそれを試してみてください。

$sql = "select siteid, row_number() OVER (ORDER BY siteid) as rownum FROM nwsite WHERE row_number() >= 4"; 

あなたが同じWHERE句で列の部分で定義されたエイリアスを使用することはできません。 WHERE句にはまだその情報はありません。

5

1つのオプションは、

  • 外側のクエリでrownumエイリアスを使用する副選択にあなたのselect文をラップ

    • にある

    SQLステートメント

    select * 
    from (
         select siteid 
           , row_number() OVER (ORDER BY siteid) as rownum 
         FROM nwsite 
         ) q 
    where rownum >= 4 
    
  • 1

    使用共通テーブル式は:

    with Result (field1, field2...,rn) 
    as 
    (select field1, field2..., rn=row_number() over (partition by field1 order by field 2) 
    from yourTable) 
    select * from result where rn<=3 ; -- top 3 in each group 
    
    1

    また、あなたはそれを参照することができますされ、CROSS APPLYRowNumを定義することができます。結果セットが決定されると、セットは、行番号として物事を決定するために分析関数を供給することができ、どの行が前にあり、どのような行は、以下:私の理解は、分析関数は後処理工程であることである

    select siteid, 
         RowNum 
    FROM nwsite 
    CROSS APPLY (SELECT row_number() OVER (ORDER BY siteid)) CxA(rownum) 
    WHERE rownum >= 4 
    
    +0

    [これは正しく動作しません](http://sqlmag.com/blog/tip-apply-and-reuse-column-aliases) –

    関連する問題