2017-02-24 276 views
-1

我有一個客戶誰得到:ORA-30926:無法獲得在源表穩定組的列:ORA-30926:無法獲得穩定的組行的源表

日誌顯示錯誤按摩錯誤(30926)

13:52:19 (00:00:02.406) ERROR : Error (30926) (00:00:02.406) ORA-30926: Stabile Zeilengruppe in den Quelltabellen kann nicht eingelesen werden 
TS03_MIN0100: UpdTable failed. Update inv_value in cMinTimeTable: 
MERGE INTO HUBWBPMS5_ENTTS03005400223 a USING (SELECT DISTINCT a.inv_value + 
(a.inv_value_sum - h.inv_value) AS inv_value , a.rowid xzfd_rid 
FROM HUBWBPMS5_ENTTS03005700223 h , HUBWBPMS5_ENTTS03005400223 a 
WHERE a.voucher_no = h.voucher_no AND a.sequence_no = h.max_seq_no 
AND a.client = h.client) xzfd_t ON (xzfd_t.xzfd_rid = a.rowid) 
WHEN MATCHED THEN 
UPDATE 
SET a.inv_value = xzfd_t.inv_value 

我檢查了表中的重複值,但無法找到任何異常。 也許有人有一個可能有用的想法。

查詢是:

查詢導致錯誤(臨時表):

INSERT INTO HUBWBPMS5_ENTTS03005700228 (agg_flag , ace_code , activity , category , client , cost_dep , description , dim1 , dim2 , dim3 , dim4 , inc_ref , inv_value , max_seq_no , pd , period , project , resource_id , resource_typ , trans_date , unit , voucher_no , work_order , work_type) 
SELECT agg_flag , ace_code , activity , category , client , cost_dep , description , dim1 , dim2 , dim3 , dim4 , inc_ref , SUM (inv_value) inv_value , max_seq_no , pd , period , project , resource_id , resource_typ , trans_date , unit , voucher_no , work_order , work_type 
FROM HUBWBPMS5_ENTTS03005400228 
WHERE agg_flag = 1 
GROUP BY agg_flag , ace_code , activity , category , client , cost_dep , description , dim1 , dim2 , dim3 , dim4 , period , trans_date , voucher_no , max_seq_no , inc_ref , pd , project , resource_id , resource_typ , unit , work_order , work_type 
+0

向我們顯示查詢以及格式化文本。 – jarlh

+0

當有多個記錄匹配合並條件時,通常會彈出這種錯誤。所以Oracle不知道首先應用哪一行。 –

+0

我跑的follogin查詢以查找重複的: 選擇客戶端,attribute_id,invoice_code,類型,由客戶端,attribute_id,invoice_code,類型從atsinvrules step_id的數據類型 基,step_id的數據類型具有計數 (*)> 1 在表有問題,但沒有發現重複。 –

回答

1

當你得到這個錯誤,這將是從MERGE語句,則表明有多個行與目標表中要加入的行相匹配的源數據集,因此,Oracle不知道使用哪一個來執行更新。

以你的MERGE語句:

MERGE INTO HUBWBPMS5_ENTTS03005400223 a 
USING (SELECT DISTINCT a.inv_value + (a.inv_value_sum - h.inv_value) AS inv_value, 
         a.rowid xzfd_rid 
     FROM HUBWBPMS5_ENTTS03005700223 h, 
       HUBWBPMS5_ENTTS03005400223 a 
     WHERE a.voucher_no = h.voucher_no 
     AND a.sequence_no = h.max_seq_no 
     AND a.client = h.client) xzfd_t 
    ON (xzfd_t.xzfd_rid = a.rowid) 
WHEN MATCHED THEN 
    UPDATE SET a.inv_value = xzfd_t.inv_value; 

它看起來像兩個表HUBWBPMS5_ENTTS03005700223和HUBWBPMS5_ENTTS03005400223在xzfd_t子查詢之間的連接會導致多行的一個或多個HUBWBPMS5_ENTTS03005400223行(退還即你。獲取多行返回至少一個a.rowid)。

要進行檢查,運行:

SELECT xzfd_rid, 
     COUNT(*) cnt 
FROM (SELECT DISTINCT a.inv_value + (a.inv_value_sum - h.inv_value) AS inv_value, 
         a.rowid xzfd_rid 
     FROM HUBWBPMS5_ENTTS03005700223 h, 
       HUBWBPMS5_ENTTS03005400223 a 
     WHERE a.voucher_no = h.voucher_no 
     AND a.sequence_no = h.max_seq_no 
     AND a.client = h.client) 
GROUP BY xzfd_rid 
HAVING COUNT(*) > 1; 

爲了解決這個問題,你需要做的xzfd_t子查詢返回一行每個xzfd_rid。可能使用row_number()選擇單個行,或者使用聚合查詢來概括每個a.rowid而不是DISTINCT的所有h.inv_value字段。

相關問題