varias update una tablas tabla subconsultas otra masivo ejemplos ejemplo oracle inner-join ora-00933

una - update oracle varias tablas



Declaración de actualización con unión interna en Oracle (13)

Tengo una consulta que funciona bien en MySQL, pero cuando la ejecuto en Oracle obtengo el siguiente error:

Error de SQL: ORA-00933: el comando SQL no finalizó correctamente
00933. 00000 - "Comando SQL no finalizado correctamente"

La consulta es:

UPDATE table1 INNER JOIN table2 ON table1.value = table2.DESC SET table1.value = table2.CODE WHERE table1.UPDATETYPE=''blah'';


Como se indica here , la sintaxis general para la primera solución propuesta por Tony Andrews es:

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 )

Creo que esto es interesante, especialmente si desea actualizar más de un campo.


Esa sintaxis no es válida en Oracle. Puedes hacerlo:

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);

O quizás puedas hacer esto:

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

(Depende si la vista en línea se considera actualizable por Oracle).


Esta siguiente sintaxis funciona para mí.

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;


Funciona bien oracle

merge into table1 t1 using (select * from table2) t2 on (t1.empid = t2.empid) when matched then update set t1.salary = t2.salary


Fusionar con la cláusula donde trabajó para mí:

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;

Necesita la cláusula WHERE porque las columnas a las que se hace referencia en la cláusula ON no se pueden actualizar.


No utilice algunas de las respuestas anteriores.

Algunos sugieren el uso de SELECT anidado, no hagas eso, es extremadamente lento. Si tienes muchos registros para actualizar, usa join, así que algo como:

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;

Vea este enlace para más detalles. http://geekswithblogs.net/WillSmith/archive/2008/06/18/oracle-update-with-join-again.aspx .

Además, asegúrese de que haya claves primarias en todas las tablas a las que se une.


Usando la descripción en lugar de desc para table2,

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'' ;


Oracle no admite uniones en las declaraciones UPDATE .

Utilizar esta:

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;


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 (SELECT T.FIELD A, S.FIELD B FROM TABLE_T T INNER JOIN TABLE_S S ON T.ID = S.ID) SET B = A;

A y B son campos de alias, no es necesario que apuntes a la tabla.


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`


UPDATE table1 t1 SET t1.value = (select t2.CODE from table2 t2 where t1.value = t2.DESC) WHERE t1.UPDATETYPE=''blah'';


update table1 a set a.col1=''Y'' where exists(select 1 from table2 b where a.col1=b.col1 and a.col2=b.col2 )