如果在查询中的多个位置重复不相关的子查询,是否可以缓存它并重复使用结果?

Dau*_*aud 5 sql postgresql subquery postgresql-9.1

如果我有一个像这样的查询

SELECT date_trunc('day', assigndate)e,
       count(CASE WHEN a.assigneeid = 65548
             AND a.assigneeid IN
               (SELECT userid
                FROM groupmembers
                WHERE groupid = 65553) THEN 1 ELSE NULL END) assigned,
       count(CASE WHEN a.assigneeid = 65548
             AND a.completedtime IS NOT NULL
             AND a.assigneeid IN
               (SELECT userid
                FROM groupmembers
                WHERE groupid = 65553) THEN 1 ELSE NULL END) completed
FROM ASSIGNMENT a
WHERE assigndate > CURRENT_TIMESTAMP - interval '20 days'
GROUP BY date_trunc('day',assigndate);
Run Code Online (Sandbox Code Playgroud)

有问题的子查询是

SELECT userid
                FROM groupmembers
                WHERE groupid = 65553
Run Code Online (Sandbox Code Playgroud)

然后,由于子查询是not co-related父查询,它将只执行一次,并将使用缓存的结果.但由于子查询存在于查询中的2个位置,因此根据SQL plan它,它被评估两次.是否有任何方法cache可以获得该子查询的结果并在两个位置使用它?

子查询无法转换为连接,因为没有要加入的单个字段(并且它不能是无条件连接,因为计数将变为错误)

pod*_*ska 12

你可以使用普通表express(WITH)

with cte as 
(
     SELECT userid FROM groupmembers WHERE groupid = 65553
)
SELECT 
    date_trunc('day', assigndate)e,  
    count(CASE WHEN a.assigneeid = 65548 AND a.assigneeid IN  
           (SELECT userid from cte) then 1 else null end) assigned,
...
Run Code Online (Sandbox Code Playgroud)

  • 它是[记录](http://www.postgresql.org/docs/current/static/queries-with.html):_ WITH查询的一个有用属性是每次执行父查询时它们只被评估一次,即使它们被父查询或兄弟WITH查询多次引用._ (3认同)