Oracle 9i Sub查询

时间:2013-01-08 07:53:40

标签: oracle

嗨,任何人都可以帮助我摆脱这个形成逻辑的查询

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';  

如果我在查询性能和标准方面形成错误的查询结构,请纠正我。在此先感谢

2 个答案:

答案 0 :(得分:1)

如果你有一些索引或分区表我不会在列上使用函数而是在变量上使用索引/选择分区。

我也使用ANSI 92 SQL语法。您没有指定(或不直接)cpp_prcnt和cpp_view之间的连接协议,因此它实际上是一个笛卡尔积(交叉连接)

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的定义(如果简单)以及你想要实现的目标,我打赌还有更多的事情需要改进/修复。

答案 1 :(得分:0)

您可以改进一些事项:

  • 如果可能的话,在比较中摆脱UPPER() - 这将使任何索引无效。如果那是不可能的,请考虑UPPER(CPPNO)
  • 上基于函数的索引
  • 不要将您的DATE列转换为字符串以将其与字符串进行比较 - 反之亦然(即将您的字符串转换为日期=>只需要一次转换而不是每个表行一次,使用索引可能的)
  • 使用EXISTS而不是IN,正如Dileep所建议的那样 - 可能会更快