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

hacer update con select

Estas en el tema de hacer update con select en el foro de Oracle en Foros del Web. Hola alguien me ayuda a correguir este update.LO que hace es actualizar varios registros para una sola columna pero me da el siguiente error. Cita: ...
  #1 (permalink)  
Antiguo 11/04/2013, 09:57
 
Fecha de Ingreso: marzo-2012
Ubicación: Los olivos
Mensajes: 40
Antigüedad: 12 años, 7 meses
Puntos: 1
Pregunta hacer update con select

Hola alguien me ayuda a correguir este update.LO que hace es actualizar varios registros para una sola columna pero me da el siguiente error.

Cita:
"Error SQL: ORA-01779: cannot modify a column which maps to a non key-preserved table
01779. 00000 - "cannot modify a column which maps to a non key-preserved table"
*Cause: An attempt was made to insert or update columns of a join view which
map to a non-key-preserved table.
*Action: Modify the underlying base tables directly."
Código SQL:
Ver original
  1. UPDATE (
  2. SELECT
  3. x.kpi_bueno AS old_bueno,
  4. y.valor AS new_bueno
  5. FROM kpi_detalle x
  6. INNER JOIN
  7. (
  8.     SELECT a.cod_area_empr,a.cod_cargo_pers,a.cod_pers,a.vkpi_fec_medida,SUM(vkpi_valor) AS valor
  9.     FROM vkpi_vector a
  10.     LEFT JOIN dkpi_vector b ON b.dkpi_vector_id = a.dkpi_vector_id
  11.     WHERE b.ind_estado='B'
  12.     GROUP BY a.cod_area_empr,a.cod_cargo_pers,a.cod_pers,a.vkpi_fec_medida
  13. ) y ON x.cod_area_empr=y.cod_area_empr
  14. AND x.cod_cargo_pers = y.cod_cargo_pers
  15. AND x.cod_pers = y.cod_pers
  16. AND x.vkpi_fec = y.vkpi_fec_medida
  17. ) SET old_bueno = new_bueno;
__________________
Conocimiento que no se comparte se pierde

Última edición por gnzsoloyo; 11/04/2013 a las 10:13 Razón: Mal etiquetado.
  #2 (permalink)  
Antiguo 11/04/2013, 10:13
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: hacer update con select

No es exactamente un error. Estás tratando de hacer una operación ilegal...

En esencia, estás tratando de hacer un UPDATE a una tabla que no existe, porque es una tabla producto de una consulta.
¿Dónde has visto que se pueda hacer eso?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 11/04/2013, 10:52
 
Fecha de Ingreso: marzo-2012
Ubicación: Los olivos
Mensajes: 40
Antigüedad: 12 años, 7 meses
Puntos: 1
Mensaje Respuesta: hacer update con select

Hola,
gracias por la respuesta. Mira aqui tengo un ejemplo con esa estructura.
Necesito una idea de como puedo realizar ese update.
Este query si funciona
Código SQL:
Ver original
  1. UPDATE (
  2.   SELECT B.COD_VEND AS OLD_VEND,
  3.   A.COD_VEND AS NEW_VEND
  4.   FROM doc_x_cob@ERP_LINK A
  5.   INNER JOIN doc_x_cob B ON A.COD_EMPR=B.COD_EMPR AND A.NRO_DXC=B.NRO_DXC
  6. )
  7. SET OLD_VEND = NEW_VEND;
__________________
Conocimiento que no se comparte se pierde

Última edición por gnzsoloyo; 11/04/2013 a las 12:42 Razón: Mal etiquetado. Usar Highlight "SQL"
  #4 (permalink)  
Antiguo 11/04/2013, 10:59
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: hacer update con select

gnzsoloyo... realmente este tipo de operaciones si son posibles pero se tiene que tener muy claro que es lo que quieres y como lo quieres.

Por ejemplo, no sabemos si el resultado interno de la consulta devuelve valores consistentes y que no afecten la relación de los datos. Es muy importante que existan las respectivas llaves foraneas con sus indices asociados.

No conocemos tus tablas, ni los datos. un solo dato te puede hacer un dolor de cabeza esta operación.

Mi recomendación es la que te dice oracle en el mensaje de error:
*Action: Modify the underlying base tables directly."

Saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 11/04/2013, 20:23
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: hacer update con select

Pues si, @huesos52, realmente Oracle tiene algunas cuantas cosas interesantes, pero me parece que el problema viene por dos lados: Primero, tengo la impresión que lo está escribiendo mal, y por otro lado... ¿no sería mejor usar MERGE para este caso?

PD: Recién hace unos meses que estoy dedicado a full a Oracle (cosas de trabajo).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 11/04/2013, 20:34
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: hacer update con select

Bienvenido colega. Yo ya llevo poco mas de un año trabajando de lleno en este brillante pero costoso juguete.

Volviendo al tema, ahora que lo dices, la consulta no es muy coherente.

La sentencia qud tiene marioincio contiene en la subconsulta interior el uso de group by.
Este tipo de operaciones tienen ciertas reglas que se deben cumplir. Entre esas, evitar el uso de group by.

Aca dejo la referencia de las reglas que se deben respetar.
http://docs.oracle.com/cd/E17952_01/...atability.html
Esto teniendo en cuenta que una subconsulta se comporta con todas las propiedades de una vista.

Estoy totalmente deacuerdo en el uso de merge.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 11/04/2013, 21:35
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: hacer update con select

Me parece que lo que quieres hacer es seguir este esquema:
Código SQL:
Ver original
  1. UPDATE <table_name> <alias>
  2. SET <column_name> =  (
  3.    SELECT (<column_name>, <column_name>)
  4.    FROM <table_name>
  5.    WHERE <alias.column_name> = <alias.column_name>)
  6. WHERE <column_name> <condition> <value>;


Con lo que una opción sería:
Código SQL:
Ver original
  1. UPDATE doc_x_cob B
  2. SET B.COD_VEND =
  3.   (
  4.   SELECT A.COD_VEND
  5.   FROM doc_x_cob@ERP_LINK A
  6.   )
  7. WHERE A.COD_EMPR = B.COD_EMPR AND A.NRO_DXC = B.NRO_DXC;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: select, sql, 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 12:56.