Инструкция 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`