在 sum case 中使用 exists 子句(oracle)

Posted

技术标签:

【中文标题】在 sum case 中使用 exists 子句(oracle)【英文标题】:using exists clause in a sum case (oracle) 【发布时间】:2017-10-17 13:57:52 【问题描述】:

我试图避免两个表之间非常昂贵的连接:我想知道是否可以使用 EXISTS 子句,因为我不需要显示第二个表中的任何字段。 代码,此时为:

SELECT
t1.year, t1.month,
sum(case when (t1.flag1=0 and **t2.flag2=1**) then 1 else 0 end) as sum1
sum(case when (t1.flag1=1 and **t2.flag2=0**) then 1 else 0 end) as sum2
FROM
t1
**RIGHT JOIN t2 on (t1.uk1 = t2.uk2)**
GROUP BY
t1.year, t1.month

我还没有找到任何可能的解决方案,我想知道是否有人知道该怎么做。 谢谢!

【问题讨论】:

【参考方案1】:

您是说uk2t2 中的唯一键,所以您只需要查找是否存在t2.uk2 = t1.uk1t2.flag = 1 的行然后加入可以停止 - 无需继续?

如果是这样:

SELECT
t1.year, t1.month,
sum(case when t1.flag1=0 and 
              t1.uk1 in (select t2.uk2 from t2 where t2.flag = 1)
              then 1 else 0 end)
FROM
t1
GROUP BY
t1.year, t1.month

请注意,虽然半连接(使用 IN 或 EXISTS)会节省一些时间,但不会太多。这不是整个连接,但它仍然是部分连接;这是你无法避免的。

【讨论】:

非常感谢您的解决方案。我试图实现它,而不是“in”,我想我可以使用“=”。不幸的是,我很快就意识到,我需要在查询的一个点计算这个 sum(decode(t2.flag2, 1, 1, 0)) 我不知道你建议的解决方案在这种情况下是否仍然有效(如果是,请告诉我!!)无论如何,您的解决方案在许多其他情况下都会非常有用。再次感谢您!

以上是关于在 sum case 中使用 exists 子句(oracle)的主要内容,如果未能解决你的问题,请参考以下文章

sum case 问题,groupby 子句没有列

多功能子句标题的使用

PostgreSQL 分组聚合查询中 filter 子句替换 case when

sql server 2008 r2:当前会计年度 where 子句中的 case 语句

Hive 在使用 case 语句和聚合时按列分组出错

在 where 子句中使用 CASE