2017-02-22 13 views
0

私は新しいstackoverflowです。何週間もこの問題に悩まされていますが、これと似たような例は見つけられません。私が達成しようとしているのは、あるテーブルの値を別のテーブルから更新することですが、同様の外観のキーワードを使用します。私が持っている2つのテーブル oracleのlike節を使用して別のテーブルのテーブルを更新します。

table1 (id, item) values:

id | item 
------------- 
10 | book 
20 | copy 
30 | pen 

table2 (id,item) values:

id | item 
------------- 
null | the big book 
null | the copy machine 
null | penpal 

は今、私が欲しいへ:

Update table2 A 
Set id = Select id From table1 B 
       Where A.item Like B.item; 

私の望ましい結果は次のとおりです。 -

id | item 
------------- 
10 | the big book 
20 | the copy machine 
30 | penpal 

それはそれを行うにはどうすればよいです?皆さん、ありがとうございました。

+0

テーブル2に「大きな本」と「大きな重い本」のようなエントリがありますか?もしそうなら、どちらを選ぶでしょうか? – Shruti

+0

@ Shruti:最小の丸を持ったもの。 – Joey

答えて

1
update table2 set id = 
    (select min(id) from table1 
    where table2.item like '%' || table1.item ||'%'); 
+0

yaay、それはちょうどそれを実行するためにしばらく時間がかかります。 where句に条件を追加して条件を設定すると、クエリの更新に時間がかかり、更新に要する時間が短くなるかどうかを尋ねたいだけです。どうもありがとう。 update table2 set id = (table1からmin(id)を選択してください。 ここで、 '%' || table1.item || '%'、table2.itemのようなtable2.itemはnullです)。 – Joey

+0

where節が多くの行をフィルタリングする場合、おそらくより速く実行されますが、where条件によってほとんどすべての行が見つかると、おそらく遅くなります。やってみなきゃ。 –

+0

ええ、私は試みました..そして、クエリはまだ30分以上実行されています。とにかくありがとう。 :)最悪の場合は最悪になるcron仕事。 :) – Joey

0
update table2 t2 
set id = (select min(id) from table1 t1 where item like '%' || t1.item || '%') 
where exists (select 1 from table1 t1 where item like '%' || t1.item || '%'); 
1

マージ:

MERGE INTO Table2 tar 
USING 
(
    SELECT MIN(T1.ID) AS ID, T2.item AS item 
    Table2 T2 
    LEFT JOIN 
    Table1 T1 
    ON (T2.item LIKE '%'||T1.item||'%') 
    GROUP BY T2.item 
) src 
ON (tar.item = src.item) 

WHEN MATCHED THEN UPDATE 
SET tar.id = src.id; 

このソリューションがより速くなることがあります。

+0

ナマステスシュルティ、お返事ありがとうございました。しかし、私は下のエラーを取得: - SQLエラー:ORA-00933:SQLコマンドが正常に終了しなかっ 00933. 00000 - 表1 = industry_token 表2 = industry_validation 変更したスクリプトを使用し、 "適切に終了していないSQLコマンド"(私が間違っている場合は私を修正してください): - – Joey

+0

UPDATE Industry_Validation_Test SET Industry_Validation_Test.Custnm = T.Custnm FROM ( )AS MIN Custnm_Token、T2。Custnm Industry_Validation_Test T2 LEFTは|| T2.Custnm LIKE '%' にT2.Custnm BY T1.Custnm || '%' GROUP)T Industry_Validation_Test.Custnm = T.Custnmを Industry_Token T1をJOIN。 – Joey

+0

こんにちはJoey:あなたの選択リストでjoinのために 'T2.Custnm'の後に' FROM'を見逃したようです。また、CustnmではなくCustnm_Tokenの値を更新するべきですか? – Shruti