如何在表达式中重用另一个结果列的结果列

Wer*_*ght 47 sql postgresql subquery

例:

SELECT
   (SELECT SUM(...) FROM ...) as turnover,
   (SELECT SUM(...) FROM ...) as cost,
   turnover - cost as profit
Run Code Online (Sandbox Code Playgroud)

当然这是无效的(至少在Postgres中)但如何在查询中实现相同而不重写子查询两次?

Den*_*rdy 42

像这样:

SELECT
   turnover,
   cost,
   turnover - cost as profit
from (
   (SELECT SUM(...) FROM ...) as turnover,
   (SELECT SUM(...) FROM ...) as cost
   ) as partial_sums
Run Code Online (Sandbox Code Playgroud)

  • @CharlBotha:它不是从 (foo, bar) 中选择的。它是 [select] (select sum from foo), (select sum from bar) [from nothing]。 (2认同)

小智 12

您可以像这样重用查询:

WITH 
  TURNOVER AS (
    SELECT SUM(...) FROM ...)
  ),
  COST AS(
    SELECT SUM(...) FROM ...
  )

SELECT *
FROM(
 SELECT
   TURNOVER.sum as SUM_TURNOVER
 FROM
 TURNOVER,COST
 WHERE ....
) AS a
Run Code Online (Sandbox Code Playgroud)

这相当于:

SELECT *
FROM(
 SELECT
   TURNOVER.sum as SUM_TURNOVER
 FROM
 (
   SELECT SUM(...) FROM ...)
 )AS TURNOVER,
 (
   SELECT SUM(...) FROM ...
 )AS COST
 WHERE ....
) AS a
Run Code Online (Sandbox Code Playgroud)

这里有一点需要注意.第一种方法更具可读性和可重用性,但第二种方法可能更快,因为数据库可能会为它选择更好的计划.


and*_*s52 6

也许sql"with"子句可以提供帮助,如http://orafaq.com/node/1879所示(其他数据库如Postgres也可以这样做,而不仅仅是oracle).

  • 此功能称为"公用表表达式",即CTE.请参阅http://stackoverflow.com/questions/2686919/is-possible-to-reuse-subqueries (2认同)

Eri*_*ung 5

SELECT turnover, cost, turnover - cost
FROM
(
SELECT
(SELECT ...) as turnover,
(SELECT ...) as cost
) as Temp
Run Code Online (Sandbox Code Playgroud)