如何在PostgreSQL中实现MySQL类似的子查询引用选中值功能?
嘿,我来帮你把这段MySQL查询转换成PostgreSQL兼容的写法~
首先拆解下你原MySQL语句的逻辑:从sometable筛选出type='A'的行,同时对每一行的Date,在tsdata里汇总该日期所有High的总和,作为MySum返回。
在PostgreSQL里,我们有几种更优雅的实现方式,推荐优先用窗口函数(性能更优,写法也简洁):
方法一:使用窗口函数(推荐)
SELECT "Date", SUM("High") OVER (PARTITION BY "Date") AS MySum FROM sometable WHERE type = 'A';
这里的SUM("High") OVER (PARTITION BY "Date")会自动按Date分组计算总和,和你原语句的逻辑完全一致,而且不需要额外的子查询重复扫描表,效率更高。
方法二:关联子查询(贴近原语句逻辑)
如果你更想贴近原MySQL的子查询写法,也可以用关联子查询实现——PostgreSQL不支持MySQL那种在SELECT里赋值会话变量再复用的方式,但我们可以直接通过表别名关联当前行的Date:
SELECT st."Date", (SELECT SUM(ts."High") FROM tsdata ts WHERE ts."Date" = st."Date") AS MySum FROM sometable st WHERE st.type = 'A';
这里给sometable起了别名st,子查询里直接用st."Date"匹配tsdata中的日期,和原语句用@date的效果完全一样。
⚠️ 注意:PostgreSQL对标识符的大小写是敏感的,如果你的字段名是大写的(比如Date),必须用双引号"Date"包裹,否则会被自动转换成小写,可能导致字段不存在的错误。
内容的提问来源于stack exchange,提问作者user1431213
相关产品推荐
相关产品推荐

