2013-01-08 69 views
0

嗨任何一個可以幫助我走出這個查詢形成邏輯的Oracle 9i的子查詢

SELECT C.CPPID, c.CPP_AMT_MANUAL 
FROM CPP_PRCNT CC,CPP_VIEW c 
WHERE 
    CC.CPPYR IN (
    SELECT C.YEAR FROM CPP_VIEW_VIEW C WHERE UPPER(C.CPPNO) = UPPER('123') 
    AND C.CPP_CODE  ='CPP000000000053' 
    and TO_CHAR(c.CPP_DATE,'YYYY/Mon')='2012/Nov' 
    ) 
    AND UPPER(C.CPPNO) = UPPER('123') 
    AND C.CPP_CODE  ='CPP000000000053' 
    and TO_CHAR(c.CPP_DATE,'YYYY/Mon') = '2012/Nov'; 

,如果我錯形成的結構查詢,查詢性能和標準方面請大家指正的。在此先感謝

+1

到底是需要什麼樣的更快?你在執行這個查詢時遇到了問題還是你想要改變邏輯?如果是這樣,試圖達到什麼目的? – Orangecrush

+0

你好我看到where子句中的reduxancy,所以我需要簡單地說,那麼是否有可能改變它?我已經使用了兩次條件 – SANJAY

回答

1

如果您有一些索引或分區表我不會使用列上的函數,但在變量上使用函數,以便能夠使用索引/選擇分區。

而且我使用ANSI 92 SQL語法。你不指定(或不直接)cpp_prcnt和cpp_view之間的連接contition所以它實際上是一個笛卡兒積(交叉連接)

SELECT C.CPPID, c.CPP_AMT_MANUAL 
FROM CPP_PRCNT CC 
CROSS JOIN CPP_VIEW c 
WHERE 
    CC.CPPYR IN (
    SELECT C.YEAR 
    FROM CPP_VIEW_VIEW C 
    WHERE C.CPPNO = '123' 
     AND C.CPP_CODE  ='CPP000000000053' 
     AND trunc(c.CPP_DATE,'MM')=to_date('2012/Nov','YYYY/Mon') 
    ) 
    AND C.CPPNO = '123' 
    AND C.CPP_CODE  ='CPP000000000053' 
    AND trunc(c.CPP_DATE,'MM')=to_date('2012/Nov','YYYY/Mon') 

如果你告訴我們,cpp_view_view的定義(似乎是上一視圖cpp_view),CPP_VIEW的定義(如果簡單)以及你想要達到的目標,我敢打賭還有更多的事情需要改進/修正。

+0

我已經使用了兩次條件,是否可以簡化該條件 – SANJAY

+0

如果條件實際上與同一個表格相同,那麼是的,您只能使用一次,但我不知道背後是什麼觀點。你將這些條件放在不同的對象上,所以我不知道邏輯。 –

0

有一對夫婦的事情,你可以改善:

  • 如果可能的話,擺脫了比較UPPER() - 這將使任何指標無用。如果這是不可能的,請考慮在UPPER上的基於函數的索引(CPPNO)
  • 不要將DATE列轉換爲字符串以將其與字符串進行比較 - 以相反方式進行操作(即將字符串轉換爲日期= >只有一轉換需要,而不是每個錶行一個,使用索引可能)的
  • 玩弄exists代替IN,由迪利普的建議 - 也許