2012-02-17 20 views
11

Estoy tratando de replicar un comando Ingres "update tbl1 from tbl2", que no existe exactamente en Oracle.Oracle - unión de actualización - tabla sin clave conservada

Entonces uso el comando "update (select tbl1 join tbl2 ...)". Ambas tablas tienen claves principales definidas e I pensó que mi unión identificaba filas de forma única, pero sigo obteniendo "ORA-01779: no se puede modificar una columna que se asigna a una tabla no conservada por clave".

Aquí quedan en el anonimato adecuadamente definiciones de tabla y la actualización estoy tratando de ejecutar:

CREATE TABLE tbl1 
(
    ID decimal(11) NOT NULL, 
    A varchar2(3) NOT NULL, 
    B float(7), 
    CONSTRAINT tbl1_pk PRIMARY KEY (ID,A) 
) 
; 

CREATE TABLE tbl2 
(
    ID decimal(11) NOT NULL, 
    A varchar2(3) NOT NULL, 
    B float(15), 
    C float(15), 
    D char(1) NOT NULL, 
    CONSTRAINT tbl2_PK PRIMARY KEY (ID,A,D) 
) 
; 

UPDATE 
    (select tbl1.b, tbl2.c 
    from tbl1 inner join tbl2 
    on tbl1.id=tbl2.id 
    and tbl1.a=tbl2.a 
    and tbl1.b=tbl2.b 
    and tbl1.a='foo' 
    and tbl2.D='a') 
set b=c; 

¿Cómo puedo definir mi selecto de tal manera que Oracle va a estar satisfecho de que no tengo violaciónes singularidad?

Respuesta

18

Usted debe ser capaz de hacer esto con una consulta correlacionada

UPDATE tbl1 t1 
    SET t1.b = (SELECT c 
       FROM tbl2 t2 
       WHERE t1.id = t2.id 
        AND t1.a = t2.a 
        AND t1.b = t2.b 
        AND t2.d = 'a') 
WHERE t1.a = 'foo' 
    AND EXISTS(SELECT 1 
       FROM tbl2 t2 
       WHERE t1.id = t2.id 
        AND t1.a = t2.a 
        AND t1.b = t2.b 
        AND t2.d = 'a') 

El problema con el UPDATE que has escrito es que Oracle no puede garantizar que no es exactamente 1 tbl2.c valor que corresponde a una sola tbl1.b valor. Si hay varias filas en tbl2 para cualquier fila en particular en tbl1, la actualización correlacionada arrojará un error que indica que una sub consulta de una sola fila devolvió varias filas. En ese caso, necesitaría agregar algo de lógica a la subconsulta para especificar qué fila de tbl2 usar en ese caso.

+0

Esto parece resolver el problema, y ​​gracias por la explicación. Que tiene sentido. –

1

Esta instrucción falla con un error (ORA-01779 no puede modificar una columna que se asigna a una tabla sin clave conservada), porque intenta modificar la base tbl1table y la tabla tbl1 no se conserva con clave en la vista . porque aunque (ID, A) es una clave de la tabla de departamento, no es una clave de la unión.

+0

El enlace ya no existe, ¿podría actualizar o resumir la información de la página correcta? – Kosi2801

+0

Todavía existe, pero ahora es http://docs.oracle.com/cd/E11882_01/server.112/e25494/views.htm#ADMIN11783. Hace referencia a: Guía del administrador de la base de datos Oracle 11.2 -> § 24 Gestión de vistas, secuencias y sinónimos -> §§ Tablas preservadas por clave – user1136452

Cuestiones relacionadas