【问题标题】:Remove a Subquery in Postgresql在 Postgresql 中删除子查询
【发布时间】:2013-01-27 11:10:00
【问题描述】:
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 中更好的构造替换它来重构查询?

【问题讨论】:

  • Pg 版本?感谢您在查询中包含示例数据作为 CTE 表达式。
  • 使用 WITH 子句创建示例数据真是太酷了!

标签: sql postgresql join subquery


【解决方案1】:
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

【讨论】:

  • 如果您实际上有更多位置,也许可以使用“交叉表”使查询更好。
  • 谢谢马。这是非常简洁的查询。
猜你喜欢
  • 1970-01-01
  • 2017-07-28
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多