Consulta actualizacion datos de la misma tabla

16/04/2004 - 11:39 por Miguel Tubia | Informe spam
Hola,
tengo una tabla de empleados, en la que con cada contrato se le crea una
nueva fila. A los últimos empleados al encargado se le olvidó meter los
números de teléfono () y necesito que coja los campos tfno y telefono1
del último contrato que tuvo y lo ponga en el nuevo.
Se sabe cuando es nuevo pq el campo estado es null. Si se le dio de baja un
contrato ese campo valdrá 'B'. Es un varchar(1).
El último contrato q tuvo se sabe por el campo baja1. Este campo almacena la
fecha, datetime, de cuando se le dio de baja.
Solo se le han de poner los datos si los campos tfno y telefono1 del nuevo
contrato son null, pues alguno sí q introdujo.
El empleado se identifica por dni
Habia hecho la siguiente consulta, pero me da un error y me gustaria me
ayudaran si es posible:

update Datos
set tfno=isnull(tfno, (select tfno from Datos d2 where d2.dni=d.dni and
d2.estado='B' and d2.baja1=(select max (baja1) from Datos d3 where
d3.dni=d.dni))),
telefono=isnull(telefono, (select telefonofrom Datos d2 where d2.dni=d.dni
and d2.estado='B' and d2.baja1=(select max (baja1) from Datos d3 where
d3.dni=d.dni)))
from Datos d

Me dice que la tabla datos es ambigua. Seguro q he cometido varias
barbaridades con la consulta... si alguien me pudiera ayudar a realizarla le
estaria muy agradecido
Un saludo

Preguntas similare

Leer las respuestas

#1 Adrian D. Garcia
16/04/2004 - 12:13 | Informe spam
Puedes intentar con esta opcion, no la he verificado en detalle pero te dara
una idea de por donde ir en caso de error.

update Datos
set
tfno=isnull(d.tfno, d2.tfno),
telefono=isnull(d.telefono, d2.telefonofrom
from Datos d
inner join Datos d2 on
d2.dni=d.dni and
d2.estado='B' and
d2.baja1=(select max (d3.baja1) from Datos d3 where d3.dni=d.dni)

Tambien creo que se podria optimizar esta parte mas: " d2.baja1=(select max
(d3.baja1) from Datos d3 where d3.dni=d.dni) "

Saludos

Adrian D. Garcia
NDSoft
MCSD

"Miguel Tubia" escribió en el mensaje
news:
Hola,
tengo una tabla de empleados, en la que con cada contrato se le crea una
nueva fila. A los últimos empleados al encargado se le olvidó meter los
números de teléfono () y necesito que coja los campos tfno y telefono1
del último contrato que tuvo y lo ponga en el nuevo.
Se sabe cuando es nuevo pq el campo estado es null. Si se le dio de baja


un
contrato ese campo valdrá 'B'. Es un varchar(1).
El último contrato q tuvo se sabe por el campo baja1. Este campo almacena


la
fecha, datetime, de cuando se le dio de baja.
Solo se le han de poner los datos si los campos tfno y telefono1 del nuevo
contrato son null, pues alguno sí q introdujo.
El empleado se identifica por dni
Habia hecho la siguiente consulta, pero me da un error y me gustaria me
ayudaran si es posible:

update Datos
set tfno=isnull(tfno, (select tfno from Datos d2 where d2.dni=d.dni and
d2.estado='B' and d2.baja1=(select max (baja1) from Datos d3 where
d3.dni=d.dni))),
telefono=isnull(telefono, (select telefonofrom Datos d2 where d2.dni=d.dni
and d2.estado='B' and d2.baja1=(select max (baja1) from Datos d3 where
d3.dni=d.dni)))
from Datos d

Me dice que la tabla datos es ambigua. Seguro q he cometido varias
barbaridades con la consulta... si alguien me pudiera ayudar a realizarla


le
estaria muy agradecido
Un saludo


Respuesta Responder a este mensaje
#2 manel gonzalez
16/04/2004 - 12:19 | Informe spam
Encuentro un poco liada tu SQL, pero creo que esta te dará el mismo
resultado


UPDATE DATOS
SET TFNO= ISNULL(TFNO, D2.TFNO),
TELEFONO = ISNULL(TELEFONO, D2.TELEFONO)
FROM DATOS
INNER JOIN (SELECT TOP 1 DNI, TFNO, TELEFONO, BAJA1 FROM DATOS WHERE ESTADO
= 'B' ORDER BY BAJA DESC) D2 ON DATOS.DNI = D2.DNI
WHERE DATOS.ESTADO IS NULL



"Miguel Tubia" escribió en el mensaje
news:
Hola,
tengo una tabla de empleados, en la que con cada contrato se le crea una
nueva fila. A los últimos empleados al encargado se le olvidó meter los
números de teléfono () y necesito que coja los campos tfno y telefono1
del último contrato que tuvo y lo ponga en el nuevo.
Se sabe cuando es nuevo pq el campo estado es null. Si se le dio de baja


un
contrato ese campo valdrá 'B'. Es un varchar(1).
El último contrato q tuvo se sabe por el campo baja1. Este campo almacena


la
fecha, datetime, de cuando se le dio de baja.
Solo se le han de poner los datos si los campos tfno y telefono1 del nuevo
contrato son null, pues alguno sí q introdujo.
El empleado se identifica por dni
Habia hecho la siguiente consulta, pero me da un error y me gustaria me
ayudaran si es posible:

update Datos
set tfno=isnull(tfno, (select tfno from Datos d2 where d2.dni=d.dni and
d2.estado='B' and d2.baja1=(select max (baja1) from Datos d3 where
d3.dni=d.dni))),
telefono=isnull(telefono, (select telefonofrom Datos d2 where d2.dni=d.dni
and d2.estado='B' and d2.baja1=(select max (baja1) from Datos d3 where
d3.dni=d.dni)))
from Datos d

Me dice que la tabla datos es ambigua. Seguro q he cometido varias
barbaridades con la consulta... si alguien me pudiera ayudar a realizarla


le
estaria muy agradecido
Un saludo


Respuesta Responder a este mensaje
#3 Javier Loria
16/04/2004 - 14:12 | Informe spam
Hola Miguel:
Si asumimos que en la tabla de Datos la llave primaria es DNI-Baja1 (o
por lo menos que no sean NULL y que no se repitan). Entonces lo podemos
hacer por partes:
El siguiente SELECT te da el ultimo contrato "valido" del empleado o sea el
ultimo contrato con telefono no nulo y Estado en B (No estoy seguro que esta
ultima condicion se requiera, pero la deje porque la pusiste).
SELECT DNI, MAX(BAJA1)
FROM DATOS
WHERE DATOS.TFNO IS NULL
AND DATOS.Estado='B'
GROUP BY DNI
Entonces el Telefono (TFNO) de este contrato se puede obtener con la
siguiente consulta:
- Telefonos del Ultimo Contrato, con Telefono
SELECT Datos.DNI, Datos.BAJA1, Datos.TFNO
FROM DATOS JOIN
(SELECT DNI, MAX(BAJA1) AS Baja1
FROM DATOS
WHERE DATOS.TFNO IS NULL
AND DATOS.Estado='B'
GROUP BY DNI) AS UltimoContratoconData
ON
DATOS.DNI=UltimoContratoconData.DNI
AND DATOS.BAJA1=UltimoContratoconData.Baja1
Por ultimo el Update podria ser escrito como:
UPDATE DATOS
SET DATOS.TFNO=UltimoTelefono.TFNO
FROM DATOS
JOIN (SELECT Datos.DNI, Datos.BAJA1, Datos.TFNO
FROM DATOS
JOIN (SELECT DNI, MAX(BAJA1) AS Baja1
FROM DATOS
WHERE DATOS.TFNO IS NULL
AND DATOS.Estado='B'
GROUP BY DNI) AS UltimoContratoconData
ON DATOS.DNI=UltimoContratoconData.DNI
AND DATOS.BAJA1=UltimoContratoconData.Baja1
) AS UltimoTelefono
ON Datos.DNI=UltimoTelefono.DNI
AND Datos.Baja1=UltimoTelefono.Baja1
WHERE DATOS.TFNO IS NULL
Si esto funciona puedes reemplazar TFNO por Telefono y haces la segunda
actualizacion por separado.
Claro como no tenemos el DDL esta sin probar y es posible que tenga
problemas de sintaxis :(
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Miguel Tubia escribio:
Hola,
tengo una tabla de empleados, en la que con cada contrato se le crea
una nueva fila. A los últimos empleados al encargado se le olvidó
meter los números de teléfono () y necesito que coja los campos
tfno y telefono1 del último contrato que tuvo y lo ponga en el nuevo.
Se sabe cuando es nuevo pq el campo estado es null. Si se le dio de
baja un contrato ese campo valdrá 'B'. Es un varchar(1).
El último contrato q tuvo se sabe por el campo baja1. Este campo
almacena la fecha, datetime, de cuando se le dio de baja.
Solo se le han de poner los datos si los campos tfno y telefono1 del
nuevo contrato son null, pues alguno sí q introdujo.
El empleado se identifica por dni
Habia hecho la siguiente consulta, pero me da un error y me gustaria
me ayudaran si es posible:

update Datos
set tfno=isnull(tfno, (select tfno from Datos d2 where d2.dni=d.dni
and d2.estado='B' and d2.baja1=(select max (baja1) from Datos d3 where
d3.dni=d.dni))),
telefono=isnull(telefono, (select telefonofrom Datos d2 where
d2.dni=d.dni and d2.estado='B' and d2.baja1=(select max (baja1) from
Datos d3 where d3.dni=d.dni)))
from Datos d

Me dice que la tabla datos es ambigua. Seguro q he cometido varias
barbaridades con la consulta... si alguien me pudiera ayudar a
realizarla le estaria muy agradecido
Un saludo
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida