嗨,任何人都可以帮助我摆脱这个形成逻辑的查询
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';
如果我在查询性能和标准方面形成错误的查询结构,请纠正我。在此先感谢
答案 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)
您可以改进一些事项: