sql - 如果一个不相关的子查询在查询中的几个地方重复出现,是否可以缓存它并重用结果?

标签 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);

有问题的子查询是

SELECT userid
                FROM groupmembers
                WHERE groupid = 65553

那么由于子查询与父查询不相关,它只会执行一次并使用缓存的结果。但由于子查询出现在查询中的 2 个位置,因此根据 SQL 计划,它被计算两次。有没有办法缓存该子查询的结果并在两个位置使用它?

子查询不能转换为连接,因为没有单个字段可以连接(而且它不能是无条件连接,因为那样计数会出错)

最佳答案

您可以使用公用表表达式 ( 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,
...

关于sql - 如果一个不相关的子查询在查询中的几个地方重复出现,是否可以缓存它并重用结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13011280/

相关文章:

regex - PostgreSQL 正则表达式 - 查找具有单个字符的记录

mysql - 分组依据将最旧和最新的日期放入一行

php - 3合1 mysql语句

mysql - MySQL 中何时使用单引号、双引号和反引号

java - hibernate 中字符串字段与字符串数组的交集

sql-server - "Sub SELECT before INNER JOIN"还是 "WHERE after INNER JOIN"?

django - 相关对象查询 Django Rest Framework

PHP for every 在 while 循环中从表中选择

ruby-on-rails - rails : Postgres permission denied to create database on rake db:create:all

sql - 使用 PostgreSQL 从稀疏表中检索两列、批量、随机访问