2013-09-23 80 views
0

我不明白我在做什么错。我试图让每一个满足标准的或标准B.select count(ID)where ID IN a or b

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 

**注ID的每周COUNT:PK在表1 = FK表2中,所以在第一个子查询,我检查是否表1中的PK在表2中以FK存在。一周来自TO_CHAR(TO_DATE(TRUNC(A.CREATE_TIMESTAMP,'IW')),'IW')

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

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

+0

什么关于工会吗? –

+0

哪个数据库和版本的数据库? –

+0

“我知道我可以单独运行它们,然后将它们汇总到电子表格中”:如果任何ID在子查询A中不存在,但在子查询B中,则它们将被计数两次,如果这样做的话。只是因为*你*知道情况并非如此,并不意味着数据库知道。数据库必须检查,以便给你正确的结果,不幸的是,它似乎并没有以最有效的方式这样做。 – hvd

回答

0

我试图让每一个满足标准的或标准B ID的每周COUNT

但是你的代码是:

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

未在与您的赔率需求。

假设你ID的同时符合两个条件,使用方法:

ID in (
    select ... -- this is subquery A 
    union 
    select ... -- this is subquery B) 
相关问题