postgresql 通过 CROSS JOIN LATERAL 做嵌套查询

一般来说,SQL 子查询只能引用外查询中的字段,而不能使用同一层级中其他表中的字段。例如:

– 错误示例
SELECT d.dept_name,
t.avg_salary
FROM department d
JOIN (SELECT avg(e.salary) AS avg_salary
FROM employee e
WHERE e.dept_id = d.dept_id) t;
SQL 错误 [42601]: ERROR: syntax error at end of input
位置:183
1
2
3
4
5
6
7
8
9
由于 JOIN 子句中的查询语句 t 引用了左侧 department 表中的字段,因此产生了语法错误。

为了解决以上问题,我们可以使用 PostgreSQL 提供的横向子查询(LATERAL subquery)。不过在介绍 LATERAL 关键字之前,我们先来回顾一下 SELECT 和 FROM 子句的含义。例如:

SELECT dept_id, dept_name
FROM department;
1
2
简单来说,我们可以将以上查询看作一个循环处理语句。使用伪代码实现的以上 SQL 语句如下:

for dept_id, dept_name in department
loop
print dept_id, dept_name
end loop
1
2
3
4
对于 department 中的每一条记录,都执行 SELECT 语句指定的操作,以上示例简单的输出了每行记录。

SELECT 就像一个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值