2

次のようなクエリがあります。

SELECT 
    R.*     
FROM 
    (SELECT A, B, 
            (SELECT smth from another table) as C,
     ROW_NUMBER() OVER (ORDER BY C DESC) AS RowNumber 
     FROM SomeTable) R
WHERE 
     RowNumber BETWEEN 10 AND 20

これにより、でエラーが発生しORDER BY C DESCます。

このエラーが発生する理由が理解できたので、10 行から 20 行を選択するだけでなく、and だけでSELECTもう1 つ追加することを考えました。ORDER BYSELECT

これらの行を選択するには、他にどのような方法がありますか?

4

2 に答える 2

2

列は同じレベルのエイリアスを参照できません。最初にテーブルから派生させるか、CTEを使用する必要があります。

SELECT 
    R.* , ROW_NUMBER() OVER (ORDER BY C DESC) AS RowNumber     
FROM 
    (SELECT A, B, (SELECT smth from another table) as C
     FROM SomeTable) R
-- WHERE 
     -- but you still cannot do this
     -- RowNumber BETWEEN 10 AND 20

これを行う必要があります:

select S.*
from
(
    SELECT 
        R.* , ROW_NUMBER() OVER (ORDER BY C DESC) AS RowNumber     
    FROM 
        (SELECT A, B, 
                (SELECT smth from another table) as C
         FROM SomeTable) R
) as s
where s.RowNumber between 10 and 20

深い入れ子を避け、少なくとも見栄えを良くするには、CTEを使用します。

with R as
(
     SELECT A, B, (SELECT smth from another table) as C
     FROM SomeTable
)
,S AS 
(
    SELECT R.*, ROW_NUMBER() OVER (ORDER BY C DESC) AS RowNumber
    FROM R
)
SELECT S.*
FROM S
WHERE S.RowNumber BETWEEN 1 AND 20
于 2012-05-18T12:10:13.007 に答える
1

同じでエイリアス化された列を使用することはできませんがSELECT、別の選択にラップして機能させることができます。

SELECT R.*
FROM (SELECT ABC.A, ABC.B, ABC.C, ROW_NUMBER() OVER (ORDER BY C DESC) AS RowNumber
      FROM (SELECT A, B, (SELECT smth from another table) as C FROM SomeTable) ABC 
) R
WHERE R.RowNumber BETWEEN 10 AND 20
于 2012-05-18T12:00:00.997 に答える