Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

ORA-01779: cannot modify a column which maps to a non key-preserved table

Estas en el tema de ORA-01779: cannot modify a column which maps to a non key-preserved table en el foro de Oracle en Foros del Web. Buenos días, Jajajaja les tengo el siguiente reto: Resulta que tengo en bd una inestabilidad en los datos. Tengo varios usuarios que pertenecen a una ...
  #1 (permalink)  
Antiguo 14/11/2012, 10:02
Avatar de eaanillol  
Fecha de Ingreso: septiembre-2010
Ubicación: Bogota - Colombia
Mensajes: 25
Antigüedad: 13 años, 7 meses
Puntos: 0
ORA-01779: cannot modify a column which maps to a non key-preserved table

Buenos días,
Jajajaja les tengo el siguiente reto:
Resulta que tengo en bd una inestabilidad en los datos. Tengo varios usuarios que pertenecen a una misma empresa, uno es principal y los otros secundarios, pero cada uno de ellos representan una empresa diferente, y son dueños de varios vehículos. Para saber de quién es cada vehículo se acude al idempresa en la tabla de vehículos. LO que me toca hacer es unificar los vehiculos de los usuarios secundarios a la empresa del usuario principal, es decir que los carros de los usuarios secundarios tengan el idempresa del usuario principal. Entonces leyendo en la web armé la siguiente consulta:

Código SQL:
Ver original
  1. UPDATE (SELECT ug.*,vn.idempresa,v2.company AS company2 FROM grupos g
  2. INNER JOIN usuariogrupo  ug ON ug.idgrupo = g.id/*Obtengo usuarios por grupo*/
  3. INNER JOIN visitor v ON v.visitorid = ug.idusuario/*obtengo la empresa */
  4. INNER JOIN empresa e ON e.id = v.company/*cruzo con empresa*/
  5. INNER JOIN vehiculonuevo vn ON vn.idempresa = v.company/*Cruzo con vehiculo nuevo para obtener los vehiculos por cada grupo*/
  6. INNER JOIN usuariogrupo ug2 ON ug.idgrupo = ug2.idgrupo AND ug2.conmicrositio = 'S'/*Obtengo los usuarios principales por grupo*/
  7. INNER JOIN visitor v2 ON v2.visitorid = ug2.idusuario /*Obtengo el company o idempresa del usuario principal*/
  8. )
  9. SET idempresa = company2
  10. ;
La tabla "usuariogrupo" agrupa a los usuarios por grupo y tambien contiene el idusario.
La tabla visitor contiene los usuarios y al campo company, que es el campo de empresa en esa tabla. Aqui el idusuario es el visitorid
Empresa: contiene las empresas.
vehiculonuevo contiene los vehiculos, ádemas contiene el campo idempresa.

Para identificar quien es el usuario principal la tabla usuariogrupo en el campo conmicrositio debe ser 'S'.

AL ejecutar sale el siguiente error: ORA-01779: cannot modify a column which maps to a non key-preserved table

Quedo atento...
  #2 (permalink)  
Antiguo 14/11/2012, 10:59
Avatar de eaanillol  
Fecha de Ingreso: septiembre-2010
Ubicación: Bogota - Colombia
Mensajes: 25
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: ORA-01779: cannot modify a column which maps to a non key-preserved table

Buenos días seguí intentando y me topé con la siguiente solución:

Código SQL:
Ver original
  1. UPDATE vehiculonuevo SET vehiculonuevo.idempresa =
  2. (
  3.    SELECT v2.company AS company2 FROM grupos g
  4. INNER JOIN usuariogrupo  ug ON ug.idgrupo = g.id
  5. INNER JOIN visitor v ON v.visitorid = ug.idusuario
  6. INNER JOIN empresa e ON e.id = v.company
  7. INNER JOIN usuariogrupo ug2 ON ug.idgrupo = ug2.idgrupo AND ug2.conmicrositio = 'S'
  8. INNER JOIN visitor v2 ON v2.visitorid = ug2.idusuario
  9. WHERE vehiculonuevo.idempresa = v.company
  10. )
  11. WHERE EXISTS (
  12.  SELECT v2.company AS company2 FROM grupos g
  13. INNER JOIN usuariogrupo  ug ON ug.idgrupo = g.id
  14. INNER JOIN visitor v ON v.visitorid = ug.idusuario
  15. INNER JOIN empresa e ON e.id = v.company
  16. INNER JOIN usuariogrupo ug2 ON ug.idgrupo = ug2.idgrupo AND ug2.conmicrositio = 'S'
  17. INNER JOIN visitor v2 ON v2.visitorid = ug2.idusuario
  18. WHERE vehiculonuevo.idempresa = v.company
  19. );

Solo es hacer la subconsulta en el set y colocar la misma en el where con un exists y listo. Ademas también se debe cruzar el campo de la tabla a actualizar con la consulta. :

Etiquetas: column, maps, modify, select, tabla, table, update
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:56.