当前位置: 首页 > 面试题库 >

如果在查询中的多个位置重复了一个不相关的子查询,是否可以对其进行缓存并重新使用结果?

江子石
2023-03-14
问题内容

如果我有类似的查询

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得到该子查询的结果并在两个位置上都使用它?

不能将子查询转换为联接,因为不能将其转换为联接的单个字段(并且它不能是无条件联接,因为这样计数将变为错误)。


问题答案:

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


 类似资料:
  • HQL是否可以对另一个查询的结果集进行选择?例如: 我可以在SQL中完成,但当我在HQL中尝试上述操作时,它只显示了语法错误“意外标记:(靠近第1行,第22列…”

  • 问题内容: 我有一个查询。现在,此查询当然返回一个结果集,我想要的是查询此查询的结果集,例如,我只希望上述查询具有唯一的名称。我应该提一下,我知道我可以在Query1中使用,但这只是一个示例,我的实际情况有些不同,我想知道的是是否可以查询上一个查询的结果集。我正在使用SQL Server 2012。 问题答案: 您可以使用该子句

  • 我在S3上有一堆只包含MD5的文件,每行一个。我创建了一个AWS Athena表来运行针对MD5的重复删除查询。这些文件和表中总共有数以亿计的MD5。 雅典娜表创建查询: (雅典娜):97,533,226 导出不同MD5的记录:97,581,616 结果导出中有14,790个重复项,因此计数(DISTINCT)计数都是错误的,结果导出也是错误的。 雅典娜是否在导出时创建了副本?--情节变得更加浓重

  • 问题内容: 是否可以将两个单独的(不相关的)SQL查询的结果合并到一个视图中。我正在尝试汇总一些用户数据并计算本月视频的观看次数,以显示在仪表板上。 IE, 和 我想创建一个包含这两个结果的视图。 这可能吗? 问题答案: 当然,仅当t1和t2中的输出均为一行时,这才是非常有效的。

  • 问题内容: 这个问题已经在这里有了答案 : 如何在MySQL中“如果不存在则插入”? (10个回答) 7年前关闭。 我有一个mysql表… 我只想添加不在列中的记录。 对于前 我有以下记录要添加到表中 我不想添加,因为它已经在列中。 那么,查询是否有可能先检查记录然后插入? 目前,我正在使用..首先,我先进行记录,然后对其进行匹配,然后再对其进行匹配。 但是,我只想处理一个查询。 问题答案: 您可

  • 问题内容: 我正在尝试找到一种方法来缓存不会随频率变化的查询结果。例如,来自电子商务的产品类别(手机,电视等)。我正在考虑使用模板片段缓存,但是在这个片段中,我将遍历这些类别的列表。该列表在网站的任何部分都可用,因此在我的文件中。渲染模板时是否总是要发送类别列表?还是有更动态的方法来执行此操作,以使列表始终在模板中可用? 问题答案: 将缓存的查询弹出到Django的缓存中: 然后创建一个上下文处理