2013-09-23 81 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) 
相關問題