以编程方式查找group by子句错误

时间:2017-01-27 08:19:44

标签: sql database oracle group-by

我们将把数据库从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 ;
  1. 10G工作
  2. 12C工作
  3. 案例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 ;
    
    1. 10G工作
    2. 在12C不工作(ORA-00979:不是GROUP BY表达式00979. 00000 - “不是GROUP BY表达式”)
    3. 我们的代码可能包含类似SQL的case2,这是不合适的。所以我们需要识别那些SQL。我已经准备了一个包含项目中使用的GROUP BY的SQL列表(.java文件/过程/函数/视图等)。

      要求是使用以下过程在GROUP BY中找到问题:

      1. 逐个检查列表中的SQL。
      2. 找到另一种以编程方式检查SQL列表的方​​法。
      3. 选项1需要大量的工作量,精力和时间,但我认为选项2是不可能的。

        有任何建议如何进行?

1 个答案:

答案 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对导致常量的子查询的处理在10G12C之间发生了变化。