我们将把数据库从10g更新到12c。在此之前我们需要重新访问我们的SQL,作为其中的一部分,我们需要检查GROUP BY
案例1:
SELECT abcd_pk,
COUNT(abcd_code),
ABCD_COUNT
FROM
(SELECT abcd_pk,
abcd_code,
(SELECT COUNT(abcd_code) FROM ABCD_TABLE
) "ABCD_COUNT"
FROM ABCD_TABLE
)
GROUP BY abcd_pk, ABCD_COUNT ;
案例2:
SELECT abcd_pk,
COUNT(abcd_code),
ABCD_COUNT
FROM
(SELECT abcd_pk,
abcd_code,
(SELECT COUNT(abcd_code) FROM ABCD_TABLE
) "ABCD_COUNT"
FROM ABCD_TABLE
)
GROUP BY abcd_pk ;
我们的代码可能包含类似SQL的case2,这是不合适的。所以我们需要识别那些SQL。我已经准备了一个包含项目中使用的GROUP BY
的SQL列表(.java文件/过程/函数/视图等)。
要求是使用以下过程在GROUP BY
中找到问题:
选项1需要大量的工作量,精力和时间,但我认为选项2是不可能的。
有任何建议如何进行?
答案 0 :(得分:0)
可能有效的一种解决方法是将count子查询放入聚合函数,例如: AVG()
:
SELECT abcd_pk,
COUNT(abcd_code),
AVG(ABCD_COUNT) -- use an aggregate to not offend Oracle
FROM
(
SELECT abcd_pk,
abcd_code,
(SELECT COUNT(abcd_code) FROM ABCD_TABLE) "ABCD_COUNT"
FROM ABCD_TABLE
)
GROUP BY abcd_pk;
如果这样可以解决问题,那么这意味着Oracle对导致常量的子查询的处理在10G
和12C
之间发生了变化。