在 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】:您是说uk2
是t2
中的唯一键,所以您只需要查找是否存在t2.uk2 = t1.uk1
和t2.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)的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL 分组聚合查询中 filter 子句替换 case when