ORDER BY 子句中常​​规字段和计算字段的乘积

Product of regular field and computed field in an ORDER BY clause

以下查询工作正常:

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 不存在,而在第二个查询中可以毫无问题地找到它?

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

Each expression can be the name or ordinal number of an output column (SELECT list item), or it can be an arbitrary expression formed from input-column values.

您需要对其进行子查询:

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