首页 > 解决方案 > 引用 SQL 语句中的计算字段

问题描述

我有以下架构

CREATE  TABLE QUOTE (id int, amount int);
CREATE  TABLE QUOTE_LINE (id int, quote_id int, line_amount int);


INSERT INTO QUOTE VALUES(1, 100);
INSERT INTO QUOTE VALUES(2, 200);
INSERT INTO QUOTE VALUES(3, 100);
INSERT INTO QUOTE VALUES(4, 300);



INSERT INTO QUOTE_LINE VALUES(1, 1, 5);
INSERT INTO QUOTE_LINE VALUES(2, 1, 6);
INSERT INTO QUOTE_LINE VALUES(3, 1, 4);
INSERT INTO QUOTE_LINE VALUES(4, 1, 2);
INSERT INTO QUOTE_LINE VALUES(1, 2, 5);
INSERT INTO QUOTE_LINE VALUES(2, 2, 5);
INSERT INTO QUOTE_LINE VALUES(3, 2, 5);
INSERT INTO QUOTE_LINE VALUES(4, 2, 5);

我需要运行以下查询:

SELECT QUOTE.id, 
line_amount*12 AS amount,
amount*2 as amount_doubled
from QUOTE_LINE
LEFT JOIN QUOTE ON QUOTE_LINE.quote_id=QUOTE.id;

查询中的第 3 行amount*2 as amount_double需要参考上一行计算的金额,即line_amount*12 AS amount.

但是,如果我运行此查询,它会amount从 QUOTE 表中选择,而不是amount计算出来的。如何让我的查询使用计算amount而不更改计算字段的名称?

这是用于此的 sqlfiddle: http ://sqlfiddle.com/#!17/914b2/1

注意:我知道我可以创建子查询、CTE 或横向连接,但我正在处理的表是非常宽的表,并且查询有很多连接。因此,我需要保留 LEFT INNER JOINS,而且我并不总是知道计算字段是否会在 JOINed 表中重复。表结构发生变化。

标签: sqlpostgresqlpostgresql-9.3postgresql-9.4column-alias

解决方案


使用 a将定义移至FROM子句LATERAL JOIN

select q.id, v.amount, v.amount * 2 as as amount_doubled
from QUOTE_LINE ql left join
     QUOTE q
     on ql.quote_id = q.id CROSS JOIN LATERAL
     (values (line_amount*12)) v(amount);

您也可以使用子查询或 CTE,但我喜欢横向连接方法。

注意:我希望QUOTE成为LEFT JOIN.


推荐阅读