【问题标题】:Product of regular field and computed field in an ORDER BY clauseORDER BY 子句中的常规字段和计算字段的乘积
【发布时间】:2017-03-02 16:59:02
【问题描述】:

以下查询可以正常工作:

SELECT a, b, c,
(SELECT COUNT(*) AS COUNT FROM table_b WHERE field_a = p.a) AS d
FROM table_a AS p
ORDER BY b DESC

这也有效:

SELECT a, b, c,
(SELECT COUNT(*) AS COUNT FROM table_b WHERE field_a = p.a) AS d
FROM table_a AS p
ORDER BY d DESC

但以下会产生ERROR; column 'd' does not exist 错误:

SELECT a, b, c,
(SELECT COUNT(*) AS COUNT FROM table_b WHERE field_a = p.a) AS d
FROM table_a AS p
ORDER BY (b * d) DESC

上述三个查询之间的唯一区别是ORDER BY 子句。在前两个查询中,结果按b 字段或动态d 字段排序。在最后一个查询中,结果(应该)按b 乘以d 的乘积排序。

为什么在最后一个查询中,PostgreSQL 说d 不存在,而在第二个查询中却可以毫无问题地找到它?

【问题讨论】:

    标签: postgresql sql-order-by


    【解决方案1】:

    order by clause 中的任意表达式只能由输入列组成:

    每个表达式可以是输出列(SELECT 列表项)的名称或序号,也可以是由输入列值形成的任意表达式。

    您需要对其进行子查询:

    select *
    from (select 1 as a, 2 as b) s
    order by a * b
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 2014-01-26
      • 1970-01-01
      相关资源
      最近更新 更多