Oracle - Duda incluir subconsulta en set y where

 
Vista:
sin imagen de perfil

Duda incluir subconsulta en set y where

Publicado por Daniel (3 intervenciones) el 30/03/2016 09:09:48
BUenos días,

Estoy haciendo un update que usa la misma subconsulta para el where y el set, hay alguna manera de optimizarla incluyendo algun alias para no tener que repetir la subconsulta en ambas partes:

1
2
3
4
5
6
UPDATE TABLA_1 A SET A.FECHA = (SELECT  MIN(DT_START) min_fecha FROM TABLA_2 B
	WHERE A.CAMPO1=B.CAMPO1
	GROUP BY B.CAMPO1)
 WHERE A.FECHA > (SELECT  MIN(FECHA) min_fecha FROM TABLA_2 B
	WHERE A.CAMPO1=B.CAMPO1
	GROUP BY B.CAMPO1)


Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Duda incluir subconsulta en set y where

Publicado por Josue (15 intervenciones) el 30/03/2016 17:23:18
Hola daniel mencionas que no quieres repetir la subconsulta pero a mi me parece que no es la misma consulta porque en la primera estas tomando la fecha minima del campo "DT_START" y en la segunda del campo "FECHA" por lo cual no es la misma query en caso de que sea la misma query supongamos:
1
SELECT  MIN(FECHA) min_fecha FROM TABLA_2 B WHERE A.CAMPO1=B.CAMPO1

podrias ponerlo en una variable

1
SELECT  MIN(FECHA) INTO v_variable FROM TABLA_2 B WHERE A.CAMPO1=B.CAMPO1

y luego mandarla a llamar:

1
UPDATE TABLA_1 A SET A.FECHA = v_variable  WHERE A.FECHA > v_variable
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Duda incluir subconsulta en set y where

Publicado por Daniel (3 intervenciones) el 01/04/2016 12:04:44
Gracias por tu respuesta.

Si perdona, se trataría de la misma subconsulta, como dices en vez de DT_START sería FECHA.

Respecto a la solución que planteas me surge la siguiente duda: Si ejecuto la sentencia para ponerlo en una variable, me guardaría el valor para cada uno de los registros o tendría que ir ejecutando de 1 en 1. Las líneas que indicas serían independientes o irían incluidas dentro de otra sentencia.

Gracias. Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Duda incluir subconsulta en set y where

Publicado por Josue (15 intervenciones) el 18/04/2016 19:09:17
poque mencionas que se guardaria el valor de cada registro?

cuando haces :
1
SELECT MIN(campo)

esta retornando un solo valor, el menor.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Duda incluir subconsulta en set y where

Publicado por Marco Villatoro (2 intervenciones) el 11/05/2016 20:21:43
Según veo en tu query, tienes la cláusula group by b.campo1, esto indica que te retornara más de un registro en la subconsulta que obtiene el min.

Trate de recrear tu ejemplo e intente tomar todo en un solo query, luego investigue y se puede realizar la actualización de la siguiente manera

1
2
3
4
5
6
7
update (
        select a.campo1, a.fecha,c.min_fecha
          from tabla1 a,(select b.campo1, min(b.fecha) min_fecha from tabla2 b group by b.campo1)  c
         where a.campo1 = c.campo1
           and a.fecha > c.min_fecha
        ) r
set r.fecha = r.min_fecha

Esta consulta solo funciona para update si los campos que unen las condiciones o join son llaves primarias y foráneas respectivamente.

De no contar con llaves primarias se puede utilizar el hint /*+ BYPASS_UJVC */ después del update, pero esto solo aplica para versiones anteriores a Oracle 11g

1
2
3
4
5
6
7
update /*+ BYPASS_UJVC */  (
        select a.campo1, a.fecha,c.min_fecha
          from tabla1 a,(select b.campo1, min(b.fecha) min_fecha from tabla2 b group by b.campo1)  c
         where a.campo1 = c.campo1
           and a.fecha > c.min_fecha
        ) r
set r.fecha = r.min_fecha

La sugerencia de utilizar una variable es funcional para un solo resultado, para más de un resultado puedes utilizar ciclos.

Te recomiendo los siguientes enlaces.

8 formas de hacer un update
http://www.orafaq.com/node/2450

Adiós al hint /*+ BYPASS_UJVC */
http://blog.sqlora.com/en/bye-bye-bypass_ujvc/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Duda incluir subconsulta en set y where

Publicado por Daniel (3 intervenciones) el 12/05/2016 10:31:44
Muchas gracias por la respuesta creo que ya lo tengo claro. Voy a investigar el link que me indicas para profundizar.

Un saludo,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar