【问题标题】:Order by newly selected column按新选择的列排序
【发布时间】:2012-05-18 11:55:32
【问题描述】:

我有一个类似的查询:

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 的错误。

我明白为什么会出现这个错误,所以我考虑添加另一个 SELECTORDER BY,而不是选择从 10 到 20 的行。但我认为嵌套 3 个 @987654325 并不好@ 命令。

还有什么方法可以选择这些行?

【问题讨论】:

  • 我了解产生C 的子查询与您尝试生成行号的子查询相关。如果是这样,您可以尝试将相关子查询转换为您可以加入的子查询。 (我的猜测是您只需要使用关联条件作为连接条件,但如果不查看子查询以及它与整个查询的其他部分之间的关​​系,我无法确定。)
  • 子查询正在从另一个具有简单条件的表中选择计数。
  • … (SELECT s.A, s.B, a.C, ROW_NUMBER OVER (ORDER BY a.C DESC) FROM SomeTable s INNER JOIN (SELECT Key, COUNT(*) AS C FROM AnotherTable) a ON s.Key = c.Key) R …?

标签: sql sql-server sql-order-by


【解决方案1】:

列不能引用同一级别的别名,您必须先对其进行表派生,或者使用 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

【讨论】:

    【解决方案2】:

    您不能在同一个 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
    

    【讨论】:

    • 我不完全确定我的括号平衡是否正确,但我希望这可以为您提供足够的信息以使其正常工作。
    • 实际上这是我试图避免的 3 个嵌套选择,但无论如何谢谢 )))
    猜你喜欢
    • 2020-02-27
    • 2011-07-01
    • 1970-01-01
    • 2015-02-17
    • 2012-11-14
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多