2016-11-07 35 views
0

我想使用oracle中的連接來更新表值(11g), 我已經將rowid用作同一表的連接參數,將rowid用作連接參數是安全的。 以下是我用於更新的查詢,我測試了本地數據庫的相同工作正常,但是有沒有可能是rowid不匹配的情況?更新基於Oracle中的rowid

MERGE 
INTO GEOTAG g 
USING (SELECT g2.rowid AS rid, um.RETAILER_CODE 
FROM GEOTAG g2 
JOIN RETAILER_AD_DSE b 
ON  b.CODE = g2.RETAILER_CODE 
JOIN USER_HIERARCHY_MASTER um 
ON um.RETAILER_PRIMARY_ETOPUP = b.RETAILER_PRIMARY_ETOPUP) src 
ON  (g.rowid = src.rid) 
WHEN MATCHED THEN UPDATE 
SET g.RETAILER_CODE = src.RETAILER_CODE; 
+0

你確定這個sql在語義上是正確的嗎?它使用'geotag.retailer_code = retailer_ad_dse.code'選擇行並更新同一列? –

+0

謝謝弗蘭克我已更新查詢。 –

回答

2

一個rowid將在一個表中是唯一,所以如果用「安全」你剛纔的意思是,你將加入一個行本身的話,沒錯,這就是安全的。

另一方面,你的代碼似乎是一個相當複雜的方式來做相關的更新。我懷疑你只是想要這個(如果在retailer_ad_dseuser_hierarchy_master中總是會有匹配的行,你可以省略WHERE EXISTS)。

UPDATE geotag g 
    SET g.retailer_code = (SELECT code 
          FROM retailer_ad_dse rad 
           JOIN user_hierarchy_master uhm 
            ON uhm.retailer_primary_etopup = rad.retailer_primary_etopup 
          WHERE g.retailer_code = rad.code) 
WHERE EXISTS (SELECT code 
       FROM retailer_ad_dse rad 
         JOIN user_hierarchy_master uhm 
         ON uhm.retailer_primary_etopup = rad.retailer_primary_etopup 
       WHERE g.retailer_code = rad.code) 
+0

嗨賈斯汀謝謝你回答,我已經使用查詢(如果存在)更新70K記錄,但它花了太長的時間來執行,所以我改變它基於rowid合併。 –

+0

@ShaileshYadav - 我有點難以想象爲什麼查詢計劃會有很大的不同。如果你不想調查優化器爲什麼選擇一個糟糕的計劃(大概)爲標準方法,你當然可以使用一個奇怪的'merge'構造來代替(儘管我真的想要使用主鍵而不是連接中的'rowid')。不過,我會確保爲下一個人留下一些評論。 –

+0

使用rowid不應改變任何性能。 –