Инструкция Update с внутренним соединением на Oracle
У меня есть запрос, который прекрасно работает в MySQL, но когда я запускаю его на Oracle я получаю следующую ошибку:
ошибка SQL: ORA-00933: команда SQL не завершена должным образом
00933. 00000 - "SQL команда не закончилась должным образом"
запрос:
UPDATE table1
INNER JOIN table2 ON table1.value = table2.DESC
SET table1.value = table2.CODE
WHERE table1.UPDATETYPE='blah';
13 ответов:
этот синтаксис недопустим в Oracle. Вы можете сделать это:
UPDATE table1 SET table1.value = (SELECT table2.CODE FROM table2 WHERE table1.value = table2.DESC) WHERE table1.UPDATETYPE='blah' AND EXISTS (SELECT table2.CODE FROM table2 WHERE table1.value = table2.DESC);или может уметь это делать:
UPDATE (SELECT table1.value as OLD, table2.CODE as NEW FROM table1 INNER JOIN table2 ON table1.value = table2.DESC WHERE table1.UPDATETYPE='blah' ) t SET t.OLD = t.NEW(это зависит от того, считается ли встроенное представление обновляемым Oracle).
Oracleне поддерживает соединения вUPDATEзаявления.используйте этот:
MERGE INTO table1 trg USING ( SELECT t1.rowid AS rid, t2.code FROM table1 t1 JOIN table2 t2 ON table1.value = table2.DESC WHERE table1.UPDATETYPE='blah' ) src ON (trg.rowid = src.rid) WHEN MATCHED THEN UPDATE SET trg.value = code;
слияние с where предложение работало для меня:
merge into table1 using table2 on (table1.id = table2.id) when matched then update set table1.startdate = table2.start_date where table1.startdate > table2.start_date;вам нужно
WHEREпункт, потому что столбцы, на которые ссылаетсяONпредложение не может быть обновлено.
UPDATE ( SELECT t1.value, t2.CODE FROM table1 t1 INNER JOIN table2 t2 ON t1.Value = t2.DESC WHERE t1.UPDATETYPE='blah') SET t1.Value= t2.CODE
Как указано здесь, общий синтаксис для первого решения, предложенного Тони Эндрюсом:
update some_table s set (s.col1, s.col2) = (select x.col1, x.col2 from other_table x where x.key_value = s.key_value ) where exists (select 1 from other_table x where x.key_value = s.key_value )Я думаю, что это интересно, особенно если вы хотите обновить более чем одно поле.
Не используйте некоторые из ответов выше.
некоторые предлагают использовать вложенный SELECT, не делайте этого, это мучительно медленно. Если у вас есть много записей для обновления, используйте join, так что что-то вроде:
update (select bonus from employee_bonus b inner join employees e on b.employee_id = e.employee_id where e.bonus_eligible = 'N') t set t.bonus = 0;смотрите эту ссылку для получения более подробной информации. http://geekswithblogs.net/WillSmith/archive/2008/06/18/oracle-update-with-join-again.aspx.
кроме того, убедитесь, что во всех таблицах, к которым вы присоединяетесь, есть первичные ключи.
он отлично работает oracle
merge into table1 t1 using (select * from table2) t2 on (t1.empid = t2.empid) when matched then update set t1.salary = t2.salary
этот синтаксис работает для меня.
UPDATE (SELECT A.utl_id, b.utl1_id FROM trb_pi_joint A JOIN trb_tpr B ON A.tp_id=B.tp_id Where A.pij_type=2 and a.utl_id is null ) SET utl_id=utl1_id;
С помощью описание вместо desc для таблицы 2,
update table1 set value = (select code from table2 where description = table1.value) where exists (select 1 from table2 where description = table1.value) and table1.updatetype = 'blah' ;
UPDATE table1 t1 SET t1.value = (select t2.CODE from table2 t2 where t1.value = t2.DESC) WHERE t1.UPDATETYPE='blah';
UPDATE IP_ADMISSION_REQUEST ip1 SET IP1.WRIST_BAND_PRINT_STATUS=0 WHERE IP1.IP_ADM_REQ_ID = (SELECT IP.IP_ADM_REQ_ID FROM IP_ADMISSION_REQUEST ip INNER JOIN VISIT v ON ip.ip_visit_id=v.visit_id AND v.pat_id =3702 ); `enter code here`