2013-01-08 90 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,由迪利普的建议 - 也许