Ayuda con UPDATE en SQLServer 2005

12/03/2009 - 16:43 por Mario V. | Informe spam
Saludos amigos!

Por favor si alguien puede ayudarme con lo siguiente:

Tengo que actualizar el campo TABLA1.CIUDAD (si es NULL) desde la Tabla
MOVIMIENTOS
con relacion al campo TARJETA

Hasta ahora la sentencia va asi:

UPDATE Tabla1 SET Ciudad = MOV.Ciudad
FROM Movimientos MOV
WHERE Tabla1.Ciudad IS NULL
AND MOV.TARJETA = Tabla1.TARJETA

(Sin problemas hasta aqui.)

Pero me han pedido que la actualice con la CIUDAD del ultimo registro (campo
FECHA mas reciente) de MOVIMIENTOS,
ya que pueden haber varios movimientos con diferente fecha

y esta sentencia obiamente toma la primera Ciudad deMovimientos que
encuentra


De antemano agradezco su ayuda

Mario

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
12/03/2009 - 17:12 | Informe spam
Por ejemplo,

; WITH cte AS (
SELECT ROW_NUMBER() OVER(PARTITION BY tarjeta ORDER BY fecha DESC) rn,
ciudad, tarjeta
FROM movimientos
)
UPDATE Tabla1 SET Ciudad = cte.Ciudad
FROM cte
WHERE Tabla1.Ciudad IS NULL
AND cte.TARJETA = Tabla1.TARJETA
AND cte.rn = 1;


Un saludo
-
www.navento.com
Servicios de Localización GPS


"Mario V." wrote:

Saludos amigos!

Por favor si alguien puede ayudarme con lo siguiente:

Tengo que actualizar el campo TABLA1.CIUDAD (si es NULL) desde la Tabla
MOVIMIENTOS
con relacion al campo TARJETA

Hasta ahora la sentencia va asi:

UPDATE Tabla1 SET Ciudad = MOV.Ciudad
FROM Movimientos MOV
WHERE Tabla1.Ciudad IS NULL
AND MOV.TARJETA = Tabla1.TARJETA

(Sin problemas hasta aqui.)

Pero me han pedido que la actualice con la CIUDAD del ultimo registro (campo
FECHA mas reciente) de MOVIMIENTOS,
ya que pueden haber varios movimientos con diferente fecha

y esta sentencia obiamente toma la primera Ciudad deMovimientos que
encuentra


De antemano agradezco su ayuda

Mario





Respuesta Responder a este mensaje
#2 Alejandro Mesa
12/03/2009 - 19:59 | Informe spam
Mario V.,

Tambien pudieras usar:

UPDATE Tabla1
SET Ciudad = (
SELECT TOP 1 MOV.Ciudad
FROM Movimientos MOV
MOV.TARJETA = Tabla1.TARJETA
ORDER BY FECHA_MOV DESC
)
WHERE Tabla1.Ciudad IS NULL;

No importaria mucho si no existen movimientos para esa tarjeta, porque
estamos actiualizando la columna solo cuando es NULL, pero puede que esto no
sea lo que se quiere. Si solo deseas hacerlo para tarjetas con movimientos,
entonces la cosa se complica mas.

UPDATE Tabla1
SET Ciudad = (
SELECT TOP 1 MOV.Ciudad
FROM Movimientos MOV
WHERE MOV.TARJETA = Tabla1.TARJETA
ORDER BY FECHA_MOV DESC
)
WHERE
Tabla1.Ciudad IS NULL
AND EXISTS (
SELECT *
FROM Movimientos MOV
WHERE MOV.TARJETA = Tabla1.TARJETA
);

Casi siempre, la version extendida de la sentencia update suele tener mejor
desempenio que la version ANSI. Como la propuesta de Carlos, y como esta.
Quizas la propuesta de Carlos tenga mejor desempenio debido al uso de la
funcion row_number para identificar las filas mas recientes. Tendrias que
hacer una prueba y chequear ambos planes de ejecucion.

UPDATE
t
SET
t.Ciudad = m.Ciudad
FROM
Tabla1 AS t
CROSS APPLY
(
SELECT TOP 1 MOV.Ciudad
FROM Movimientos AS MOV
WHERE MOV.TARJETA = t.TARJETA
ORDER BY MOV.FECHA DESC
) AS m
WHERE
t.Ciudad IS NULL;
GO


AMB


"Mario V." wrote:

Saludos amigos!

Por favor si alguien puede ayudarme con lo siguiente:

Tengo que actualizar el campo TABLA1.CIUDAD (si es NULL) desde la Tabla
MOVIMIENTOS
con relacion al campo TARJETA

Hasta ahora la sentencia va asi:

UPDATE Tabla1 SET Ciudad = MOV.Ciudad
FROM Movimientos MOV
WHERE Tabla1.Ciudad IS NULL
AND MOV.TARJETA = Tabla1.TARJETA

(Sin problemas hasta aqui.)

Pero me han pedido que la actualice con la CIUDAD del ultimo registro (campo
FECHA mas reciente) de MOVIMIENTOS,
ya que pueden haber varios movimientos con diferente fecha

y esta sentencia obiamente toma la primera Ciudad deMovimientos que
encuentra


De antemano agradezco su ayuda

Mario





email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida