Sql 删除列和列的冗余函数调用';s计数 问题
在以下查询中,Sql 删除列和列的冗余函数调用';s计数 问题,sql,postgresql,query-optimization,plpgsql,Sql,Postgresql,Query Optimization,Plpgsql,在以下查询中,plr\u站被调用两次: 一次限制WHERE条款;及 一次计算它返回的结果数 代码类似于: SELECT m.*, s.*, ( SELECT count(1) FROM climate.plr_stations('48.5146','-123.4447') ) AS count_stations FROM climate.station s, climate.measurement m, ( SELECT id FR
plr\u站
被调用两次:
WHERE
条款;及 SELECT
m.*,
s.*,
(
SELECT
count(1)
FROM
climate.plr_stations('48.5146','-123.4447')
) AS count_stations
FROM
climate.station s,
climate.measurement m,
(
SELECT
id
FROM
climate.plr_stations('48.5146','-123.4447')
) stations
WHERE
s.applicable AND
s.id = stations.id AND
m.station_id = s.id AND ...
然后通过日期查询聚合此查询的结果
解决
使用函数调用的结果填充临时表或数组变量
更新#1
如果函数调用的参数定义的球形多边形内有太多站点,则函数调用将随机选择站点样本
更新#2
开始完整查询的日期查询聚合如下所示:
SELECT
extract(YEAR FROM m.taken) AS year_taken,
avg(m.amount) AS amount,
count(m.amount) AS count_measurements,
md.count_stations,
min(md.elevation) AS elevation_min,
max(md.elevation) AS elevation_max
FROM
climate.measurement m, (
SELECT
m.*,
s.*, ...
问题:
除此之外,如何消除冗余呼叫
谢谢。考虑到它不应该被标记为不可变的(如果我理解其意图的话),它是否会折叠起来是值得怀疑的 根据您的要求,这方面的工作应该是可行的
with R_stations as (
SELECT
id,
count(1) over () c
FROM
climate.plr_stations('48.5146','-123.4447')
)
SELECT
m.*,
s.*,
stations.c count_stations
FROM
climate.station s,
climate.measurement m,
R_stations stations
WHERE
s.applicable AND
s.id = stations.id AND
m.station_id = s.id AND ...
但是考虑到你的聚合,这样做可能更容易
SELECT
m.*,
s.*,
stations.c count_stations
FROM
climate.station s,
climate.measurement m,
(SELECT
id,
count(1) over () c
FROM
climate.plr_stations('48.5146','-123.4447')
) stations
WHERE
s.applicable AND
s.id = stations.id AND
m.station_id = s.id AND ...
我想你甚至可以去掉这个子选择,把它变成一个“stations.c”,但如果不运行它,我就不是100%。(我做了此更改。)您不需要在此处使用WITHE,它只是使imho更易于阅读。@Dave Jarvis:如果您只需将我查询中的WITH(Select…)更改为正常的派生部分,那么您应该能够适当地嵌入它。是的,我可以完全删除
WITH
子句,并自然地嵌入子Select。再次感谢你。