【问题标题】:select count(ID) where ID IN a or bselect count(ID) where ID IN a or b
【发布时间】:2013-09-23 15:48:20
【问题描述】:

我不明白我做错了什么。我正在尝试获取满足条件 A 或条件 B 的每个 ID 的每周 COUNT 次。

  select CREATE_WEEK, count ( A.PK )
 from TABLE1 A
where    ( A.PK not in (select distinct ( B.FK )
                                    from TABLE2 B
                                  where B.CREATE_TIMESTAMP > '01-Jan-2013')
              or A.PK in (select A.PK
                                 from ( select A.PK, A.CREATE_TIMESTAMP as A_CRT, min ( B.CREATE_TIMESTAMP ) as FIRST_B
                                              from TABLE1 A, TABLE2 B
                                             where    A.PK = B.FK
                                                     and A.CREATE_TIMESTAMP > '01-Jan-2013'
                                                     and B.CREATE_TIMESTAMP > '01-Jan-2013'
                                         group by A.PK, A.CREATE_TIMESTAMP)
                                where A_CRT < FIRST_B) )
        and A.CREATE_TIMESTAMP > '01-Jan-2013'
        and CREATE_WEEK >= 2
        and THIS_WEEK - CREATE_WEEK >= 1
group by CREATE_WEEK 
order by CREATE_WEEK asc

**注意:table1 中的 PK = table2 中的 FK,所以在第一个子查询中,我正在检查 table1 中的 PK 是否作为 FK 存在于 table2 中。周来自 TO_CHAR (TO_DATE (TRUNC (A.CREATE_TIMESTAMP, 'IW')), 'IW')

当我取出 OR 并对任一子查询运行查询时,结果会在 1-2 秒内返回。但是当我尝试运行组合查询时,20 分钟后没有返回结果。

我知道我可以单独运行它们,然后将它们汇总到电子表格中,但我宁愿只得到一个数字。

【问题讨论】:

  • 哪个数据库和数据库版本?
  • "我知道我可以单独运行它们,然后将它们汇总到电子表格中,":如果子查询 A 中不存在任何 ID,但在子查询 B 中,则它们将被计算两次那。仅仅因为知道情况不会如此,并不意味着数据库知道。数据库必须进行检查才能为您提供正确的结果,不幸的是,它似乎并没有以最有效的方式这样做。
  • 这是一个与性能相关的问题。您需要确定导致性能不佳的原因 - 即检查查询计划以查看哪些更改。例如,没有 OR 的查询可能正在执行某种哈希反连接(即运行一次子查询,然后对 table 进行扫描),而具有 OR 的查询可能正在执行嵌套循环连接table 中每一行的两个子查询(AB)。
  • 没有完整代码很难回答性能问题。
  • @JoelCoehoorn - 我在此期间使用联合,但这需要在电子表格中求和。我宁愿避免这种情况,直接得到总和。

标签: sql oracle count database-performance


【解决方案1】:

我正在尝试获取满足条件 A 或条件 B 的每个 ID 的每周 COUNT 次

但是你的代码是:

ID NOT IN (subquery A) OR ID IN (subquery B)

NOT 与您的要求不一致。

假设您的 ID 满足这两个条件,请使用:

ID in (
  select ... -- this is subquery A
  union
  select ... -- this is subquery B)

【讨论】:

    猜你喜欢
    • 2018-11-14
    • 2014-04-04
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    相关资源
    最近更新 更多