2017-02-22 3 views
0

Я новичок в stackoverflow. Я застрял с этой проблемой в течение нескольких недель, но не могу найти похожие примеры для этого (исправьте меня, если я ошибаюсь). То, что я пытаюсь достичь, - это обновление значений одной таблицы из другой таблицы, но с использованием похожих похожих слов. У меня есть 2 таблицытаблица обновлений из другой таблицы, используя как оговорку в оракуле

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: тот, у которого есть min rownum. – Joey

ответ

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

yaay, он работает, просто требуется некоторое время, чтобы запустить его. просто спросите, будет ли запрос занимать больше времени/короче время для обновления, если я добавлю и условию предложения where. Большое спасибо. update table2 set id = (выберите min (id) from table1 где table2.item нравится '%' || table1.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:

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 Error: ORA-00933: команда SQL не правильно закончился 00933. 00000 - "команда SQL не правильно закончился" используется Таблица 1 = industry_token Таблица 2 = industry_validation модифицированный скрипт (исправьте меня, если я ошибаюсь): - – Joey

+0

UPDATE Industry_Validation_Test SET Industry_Validation_Test.Custnm = T.Custnm ОТ ( SELECT MIN (Industry_Token.Custnm_Token) AS Custnm_Token, T2.Custnm Industry_Validation_Test Т2 LEFT JOIN Industry_Token T1 ПО T2.Custnm LIKE '%' || T1.Custnm || '%' GROUP BY T2.Custnm ) Т ГДЕ Industry_Validation_Test.Custnm = T.Custnm; – Joey

+0

Hi Joey :) Кажется, вы пропустили 'FROM' после' T2.Custnm' в своем списке выбора для соединения. Кроме того, разве вы не должны обновлять значение Custnm_Token, а не Custnm? – Shruti

Смежные вопросы