【发布时间】:2012-10-22 12:16:03
【问题描述】:
如果我有类似的查询
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
那么由于子查询对于父查询是not co-related,所以它只会执行一次并使用缓存的结果。但由于子查询存在于查询中的 2 个位置,因此根据SQL plan,它被评估两次。有什么方法可以cache 该子查询的结果并在两个位置都使用它?
子查询不能转换为连接,因为没有单个字段可以连接(也不能是无条件连接,因为计数会出错)
【问题讨论】:
-
您似乎有多余的表达。有一个子句说“a.assigneeid = 65548”和“a.assigneeid in (subquery)”是没有意义的——它们要么都是真的,要么都是假的。
-
这只是出于示范的原因(虽然逻辑很糟糕!)
标签: sql postgresql subquery postgresql-9.1