sql - 在 Postgresql 中删除子查询

标签 sql postgresql join subquery

WITH Dept(DName) AS (
   VALUES ('D1'), ('D2'), ('D3')
) ,
Emp(DName, EName, Age, Loc) AS (
     VALUES ('D1','E11',20,'L1'), ('D1','E12',25,'L2'),('D2','E21',28,'L1')
) 
SELECT DName,

  (SELECT avg(Age)
   FROM Emp
   WHERE Loc = 'L1'
     AND DName = d.DName) AS "L1 Avg",

  (SELECT avg(Age)
   FROM Emp
   WHERE Loc = 'L2'
     AND DName = d.DName) AS "L2 Avg"
FROM Dept d
LEFT JOIN Emp USING (DName)
GROUP BY DName

这个查询的输出是:

"D1";20.0000000000000000;25.0000000000000000
"D2";28.0000000000000000;
"D3";;

有没有办法通过删除子查询并用 Postgresql 中更好的结构替换它来重构查询?

最佳答案

SELECT DName,
       avg(case when loc = 'L1' then age else null end) as "L1 Avg",
       avg(case when loc = 'L2' then age else null end) as "L2 Avg"
FROM Dept d
LEFT JOIN Emp USING (DName)
GROUP BY DName

关于sql - 在 Postgresql 中删除子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14827567/

相关文章:

mysql - 关联模型 ruby​​ on rails 上的一个数据库查询

mysql - 订购两个合并查询

mysql - 使用 mysql 连接 3 个表

sql - 使用动态行和列创建 PIVOT - SQL Server 2016

mysql - CI 事件记录样式 SQL 查询

sql - 从sql中单个逗号分隔字符串中的列获取不同的值?

PostgreSQL 异常 : “An I/O error occured while sending to the backend”

postgresql - 如何在执行 psql 复制命令时保留换行符

c# - 使用 Dapper 和 Postgres 调用存储过程

sql - 我是否比 SQL Server 更聪明,或者这是有原因的?