2017-01-27 25 views
1

我們將把數據庫從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. WORKS IN 12C

殼體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. 不起作用IN 12C(ORA-00979:不是GROUP BY表達00979. 00000 - 「不是一個GROUP BY表達式」)

我們的代碼可以包含像SQL這樣不適合的case2。所以我們需要識別這些SQL。我已經準備好了一個SQL列表,其中包含我們項目中使用的GROUP BY(.java文件/程序/函數/視圖等)。

要求是通過以下步驟找到GROUP BY問題:一個

  1. 檢查列表中的一個獲得的SQL。
  2. 查找以編程方式檢查SQL列表的替代方法。

選項1需要大量的工作量,努力和時間,但我認爲選項2是不可能的。

有什麼建議如何進行?

+0

反正我會說堅持案例1。如果遵循通用的GROUP BY規則,則永遠不會出錯 - 「如果指定了GROUP BY子句,則SELECT列表中的每個列引用都必須標識分組列或作爲set函數的參數。」 – jarlh

回答

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之間變化。

+0

是的,你說得對,但我的問題不是這樣。我知道case2是不正確的,case1是正確的。我們的代碼中已經有了一些SQL,比如case2,以前它的工作方式是10g,但目前不能在12c中工作。所以我們想把所有的case2變成case1。所以首先我們需要確定這些SQL。我的問題是如何找到所有這樣的SQLs case2? –

+0

這是一個非常難回答的問題,並說明儘量保持查詢儘可能符合ANSI標準的價值。如果你這樣做,版本的變化不會破壞任何東西。 –