2017-02-22 3 views
0

나는 stackoverflow에 새로운 있습니다. 몇 주 동안이 문제로 붙어 있지만 이와 비슷한 예제를 찾을 수 없습니다 (내가 틀렸다면 수정하십시오). 내가 달성하려고하는 것은 다른 테이블에서 한 테이블의 값을 업데이트하는 것입니다. 그러나 비슷하게 보이는 키워드를 사용합니다. 내가 가지고있는이 개 테이블 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

table2에 '큰 책'과 '큰 무거운 책'과 같은 항목이있을 수 있습니까? 그렇다면 어느 것을 골라야합니까? – Shruti

+0

@Shruti : 분 rownum와 하나. – Joey

답변

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

예, 작동하려면 잠시 시간이 걸립니다. 단지 where 절에 조건을 추가하고 조건을 설정하면 쿼리가 더 오랜 시간이 걸릴지/업데이트하는 데 더 짧은 시간이 걸릴지 묻고 싶을뿐입니다. 고마워. update table2 set id = (table1에서 min (id) 선택) 여기서 '%'|| table1.item || '%'및 table2.item과 같은 table2.item은 null입니다. – Joey

+0

where 절이 많은 행을 필터링하면 더 빨리 실행되지만 다른 한편으로는 거의 모든 행이 where 조건에 의해 여전히 발견되면 더 느리게 실행됩니다. 시도해야합니다. –

+0

예. 시도했습니다. 쿼리가 아직 30 분 이상 계속 실행 중입니다. 어쨌든 고마워. :) 최악의 경우 최악의 경우 cron job이 올 것입니다. :) – 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

Namaste shurti, 답변 해 주셔서 감사합니다. 그러나 나는 아래의 오류가 발생합니다 : - 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 ( ) SELECT MIN (Industry_Token.Custnm_Token) AS Custnm_Token, T2.Custnm Industry_Validation_Test T2 LEFT이 T2.Custnm LIKE '%'|| T1.Custnm || '%'T2.Custnm BY GROUP)의 Industry_Token T1 가입 T WHERE Industry_Validation_Test.Custnm = T.Custnm; – Joey

+0

안녕하세요 Joey :) 선택 목록에서 'T2.Custnm'다음에 'FROM'을 놓친 것처럼 보입니다. 또한 Custnm이 아닌 Custnm_Token 값을 업데이트해야합니까? – Shruti

관련 문제