none
Reemplazar el contenido de un campo por la clave primaria que corresponda RRS feed

  • Pregunta

  • Hola. En sqlserver 2005 tengo que reemplazar "DATPERS.Localidad" por "Localidades.IdLoc". Es decir, en la tabla DATPERS tengo el campo Localidad con los nombres de las localidades, necesito reemplazar eso por la clave principal que corresponde a cada localidad desde la tabla Localidades.

    La tabla localidades tiene los campos "IdLoc" y "Nombre". La tabla "DATPERS" tiene el campo "Localidad".

    Espero que se entienda.

    Gracias desde ya.

    Saludos.

     
    sábado, 11 de febrero de 2017 14:34

Respuestas

  • Se puede hacer de varias formas, por ejemplo, con una subconsulta más o menos así:

    Update DATPERS as D set localidad = (select IdLoc from Localidades as L where L.Nombre = D.Localidad)

    Dará un error si alguna localidad de DATPERS no existe en Localidades.

    sábado, 11 de febrero de 2017 14:43

Todas las respuestas

  • Se puede hacer de varias formas, por ejemplo, con una subconsulta más o menos así:

    Update DATPERS as D set localidad = (select IdLoc from Localidades as L where L.Nombre = D.Localidad)

    Dará un error si alguna localidad de DATPERS no existe en Localidades.

    sábado, 11 de febrero de 2017 14:43
  • AntiWork,

    La primera tarea que te recomiendo abordar es corroborar que todos los datos que tienes en la columna [Localidad] corresponden a un valor de la columna [Nombre]. Puedes ejecutar el siguiente script:

    SELECT
        *
    FROM
        DATPERS dp
    WHERE
        NOT EXISTS (SELECT 1 FROM Localidades l WHERE dp.Localidad = l.Nombre)
    GO

    La consulta retornará todas las filas -de la tabla [DATPERS]- que no tengan correspondencia de valor entre las columnas [Localidad] y [Nombre], queda de ti hacer las correcciones del caso.

    Una vez terminada la tarea anterior lo siguiente a realizar es:

    Primero, actualizar el valor de la clave primaria de la tabla [Localidades] en la columna [Localidad]

    UPDATE dp
    SET
        dp.Localidad = l.IdLoc
    FROM
        DATPERS dp
        INNER JOIN Localidades l ON dp.Localidad = l.Nombre;
    GO

    Segundo, cambiar el tipo de dato de la columna [Localidad]

    ALTER TABLE DATPERS ALTER COLUMN Localidad int;
    GO

    Tercero, crear la relación para establecer las reglas de IR

    ALTER TABLE DATPERS ADD CONSTRAINT FK_Localidad_IdLoc FOREIGN KEY (Localidad)  
        REFERENCES dbo.Localidad (IdLoc);
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 11 de febrero de 2017 15:07
  • Gracias Alberto. funciono!!

    Saludos

    sábado, 11 de febrero de 2017 15:30