sql - 引用 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 表中重复。表结构发生变化。
解决方案
使用 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
.
推荐阅读
- visual-studio - 为什么 _makepath_s 不返回错误?
- haskell - 无法在haskell中编译一个hello world
- c++ - 使用 stringstream 从混合字符串中提取数字
- asp.net-core - 部署时不提供 Nuget 包内容文件
- angular - 使用传递的函数引用调用方法时未定义的 Angular DI 变量
- r - 在 dplyr 组内应用函数
- vuejs2 - 我可以在 vuex 3 中使用 2 个参数调度动作吗?
- android - 画布:试图绘制太大(151099200字节)位图
- json - 如何使用 Moshi 将 json 字符串序列化为 org.json.JSONObject?
- ssl - TLS 握手失败并出现错误 tls:第一条记录看起来不像 TLS 握手服务器=Orderer remoteaddress=192.168.144.4:43496