2016-11-07 8 views
0

oracle(11g)のjoinを使用してテーブル値を更新したい 同じテーブルに対してjoinパラメータとしてrowidを使用しましたが、rowidを結合パラメータとして使用しても安全ですか? 以下は、私がupdationのために使用しているクエリです。ローカルデータベースで同じことをテストしましたが、うまく動作していますが、Rididの不一致があるシナリオがありますか?あなただけのあなたが自分自身に行を結ぶことでしょうという意味では、「安全」によるので、もし更新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を使用すると、パフォーマンスが変わることはありません。 –

関連する問題