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。再次感谢你。