none
Insert de una tabla a otra sin duplicar registros RRS feed

  • Pregunta

  • Hola

    Solicito amablemente su colaboración indicandome como insertar registros de una taba a otra omitiendo los registros duplicados.

    Lo estoy intentando de esta manera pero no lo logro hacer

    IF NOT EXISTS( SELECT CODIGO FROM LIBRO (NOLOCK) WHERE CODIGO = CODIGO )BEGIN    
    INSERT INTO LIBRO(CODIGO,TITULO,AUTOR) Select DISTINCT CODIGO,TITULO,AUTOR
    FROM LIBRO_TEMP
    END

    y si es posible hacerlo a través de un Trigger que una vez ingrese datos en tabla Libro_temp me envie los que no se dupliquen a tabla Libro.

    Muchas Gracias..



    Respuesta de foro Microsoft

    viernes, 10 de febrero de 2017 15:32

Respuestas

  • yulfredy,

    La expresión 'WHERE CODIGO = CODIGO' en cualquier caso resultará True, debes realizar la evaluación por cada fila que se intenta insertar:

    INSERT INTO dbo.LIBRO (CODIGO, TITULO, AUTOR) 
    SELECT DISTINCT 
        lt.CODIGO, lt.TITULO, lt.AUTOR
    FROM 
        dbo.LIBRO_TEMP lt
    WHERE
        NOT EXISTS (SELECT 1 FROM dbo.Libro l WHERE (lt.CODIGO = l.CODIGO));
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta HunchbackMVP viernes, 10 de febrero de 2017 15:55
    • Marcado como respuesta yulfredy viernes, 10 de febrero de 2017 18:01
    viernes, 10 de febrero de 2017 15:44
  • Funciona perfecto Muchas Gracias

    Es posible crear un Trigger para que dispare este proceso siempre que ingrese un nuevo dato en la tabla libro_temp?

    Nuevamente gracias por tu colaboración.


    Respuesta de foro Microsoft

    Toma los datos desde la pseudo-tabla inserted.

    CREATE TRIGGER dbo.NombreTrigger
        ON dbo.LIBRO_TEMP
        AFTER INSERT
    AS
    BEGIN
        INSERT INTO dbo.LIBRO (CODIGO, TITULO, AUTOR) 
        SELECT DISTINCT 
    	   i.CODIGO, i.TITULO, i.AUTOR
        FROM 
    	   inserted i
        WHERE
    	   NOT EXISTS (SELECT 1 FROM dbo.Libro l WHERE (i.CODIGO = l.CODIGO));
    END
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta yulfredy viernes, 10 de febrero de 2017 21:38
    viernes, 10 de febrero de 2017 20:35

Todas las respuestas

  • yulfredy,

    La expresión 'WHERE CODIGO = CODIGO' en cualquier caso resultará True, debes realizar la evaluación por cada fila que se intenta insertar:

    INSERT INTO dbo.LIBRO (CODIGO, TITULO, AUTOR) 
    SELECT DISTINCT 
        lt.CODIGO, lt.TITULO, lt.AUTOR
    FROM 
        dbo.LIBRO_TEMP lt
    WHERE
        NOT EXISTS (SELECT 1 FROM dbo.Libro l WHERE (lt.CODIGO = l.CODIGO));
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta HunchbackMVP viernes, 10 de febrero de 2017 15:55
    • Marcado como respuesta yulfredy viernes, 10 de febrero de 2017 18:01
    viernes, 10 de febrero de 2017 15:44
  • Hola, podrías probar

    INSERT INTO LIBRO (CODIGO,TITULO,AUTOR) 
    SELECT LT.CODIGO,LT.TITULO,LT.AUTOR 
    FROM LIBRO_TEMP LT
    LEFT JOIN LIBRO L
    ON LT.CODIGO=L.CODIGO
    WHERE L.CODIGO IS  NULL

    IF OBJECT_ID('tempdb..#libro') IS NOT NULL DROP TABLE #libro
    GO
    IF OBJECT_ID('tempdb..#libro_temp') IS NOT NULL DROP TABLE #libro_temp
    GO
    
    
    create table #libro
    (
    CODIGO int,
    TITULO varchar(100),
    AUTOR varchar (100)
    )
    
    insert into #libro(codigo,titulo,autor) values(1,'el duende','yo')
    insert into #libro(codigo,titulo,autor) values(2,'el duende 2','yo')
    insert into #libro(codigo,titulo,autor) values(3,'el duende 3','yo')
    --select * from #libro
    create table #libro_temp
    (
    CODIGO int,
    TITULO varchar(100),
    AUTOR varchar (100)
    )
    
    insert into #libro_temp(codigo,titulo,autor) values(1,'el duende','yo')
    insert into #libro_temp(codigo,titulo,autor) values(2,'el duende 2','yo')
    insert into #libro_temp(codigo,titulo,autor) values(4,'el duende 4','yo')
    
    
    INSERT INTO #libro (CODIGO,TITULO,AUTOR) 
    SELECT LT.CODIGO,LT.TITULO,LT.AUTOR 
    FROM #libro_temp LT
    LEFT JOIN #libro L
    ON LT.CODIGO=L.CODIGO
    WHERE L.CODIGO IS  NULL
    
    select * from #libro
    select * from #libro_temp



    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.






    • Editado Augusto1982 viernes, 10 de febrero de 2017 15:55
    • Propuesto como respuesta HunchbackMVP viernes, 10 de febrero de 2017 15:56
    • Votado como útil Joyce_ACModerator lunes, 13 de febrero de 2017 16:57
    viernes, 10 de febrero de 2017 15:44
  • Willams,

    Me parece que la sub-clausula DISTINCT esta de mas ya que lo que debe evitarse es traer un mismo codigo mas de una vez si es que pueden existir mas de una fila con el mismo codigo en la tabla libro_temp pero eso se lo dejo al autor de la pregunta.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    viernes, 10 de febrero de 2017 15:56
  • Estimado Alejandro,

    Pienso que la cláusula DISTINCT está "bien puesta" porque se aplica para recuperar filas únicas en el contexto de la selección, el operador EXISTS valida sobre las filas existentes sin considerar aún las que pertenecen al lote, por tanto si envías filas duplicadas las mismas se insertarán. Vamos por un pequeño ejercicio (Augusto. tomaré tus datos de prueba).

    CREATE TABLE #LIBRO
    (
        CODIGO int,
        TITULO varchar(100),
        AUTOR varchar (100)
    )
    
    INSERT INTO #LIBRO(codigo, titulo, autor) VALUES (1, 'el duende', 'yo')
    INSERT INTO #LIBRO(codigo, titulo, autor) VALUES (2, 'el duende 2', 'yo')
    INSERT INTO #LIBRO(codigo, titulo, autor) VALUES (3, 'el duende 3', 'yo')
    
    CREATE TABLE #LIBRO_TEMP
    (
        CODIGO int,
        TITULO varchar(100),
        AUTOR varchar (100)
    )
    
    INSERT INTO #LIBRO_TEMP(codigo,titulo,autor) VALUES (1, 'el duende', 'yo')
    INSERT INTO #LIBRO_TEMP(codigo,titulo,autor) VALUES (2, 'el duende 2', 'yo')
    INSERT INTO #LIBRO_TEMP(codigo,titulo,autor) VALUES (4, 'el duende 4', 'yo') /*REPETIDO*/
    INSERT INTO #LIBRO_TEMP(codigo,titulo,autor) VALUES (4, 'el duende 4', 'yo') /*REPETIDO*/
    
    INSERT INTO #LIBRO (CODIGO, TITULO, AUTOR) 
    SELECT /*DISTINCT*/
        lt.CODIGO, lt.TITULO, lt.AUTOR
    FROM 
        #LIBRO_TEMP lt
    WHERE
        NOT EXISTS (SELECT 1 FROM #LIBRO l WHERE (lt.CODIGO = l.CODIGO));
    GO
    
    SELECT * FROM #LIBRO;
    
    DROP TABLE #LIBRO;
    DROP TABLE #LIBRO_TEMP;

    Si se ejecuta el ejercicio sin la cláusula DISTINCT se insertará las filas duplicadas (que corresponde al libro 'el duende 4')


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 10 de febrero de 2017 17:17
  • Funciona perfecto Muchas Gracias

    Es posible crear un Trigger para que dispare este proceso siempre que ingrese un nuevo dato en la tabla libro_temp?

    Nuevamente gracias por tu colaboración.


    Respuesta de foro Microsoft

    viernes, 10 de febrero de 2017 19:54
  • Willams,

    Entiendo esa parte correctamente, lo que no entiendo es porque se quiciera tener el mismo codigo de libro varias veces en la tabla [libro]. Si el codigo fuese clave primaria entonces ese script diera error.

    En vez de DISTINCT insertaria una sola fila entre las repetidas, pero eso se lo dejo al duenio del hilo.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    viernes, 10 de febrero de 2017 20:10
  • Alejandro,

    Quizá se trata de un destino de importación de datos o algo parecido sobre el que no se tiene control y precisamente se transfiere a la tabla [LIBRO] para hacer algo de "limpieza", no lo sé, son sólo especulaciones, yo no podría resolver la duda siendo que la escribiste dirigida a mi. 

    viernes, 10 de febrero de 2017 20:31
  • Funciona perfecto Muchas Gracias

    Es posible crear un Trigger para que dispare este proceso siempre que ingrese un nuevo dato en la tabla libro_temp?

    Nuevamente gracias por tu colaboración.


    Respuesta de foro Microsoft

    Toma los datos desde la pseudo-tabla inserted.

    CREATE TRIGGER dbo.NombreTrigger
        ON dbo.LIBRO_TEMP
        AFTER INSERT
    AS
    BEGIN
        INSERT INTO dbo.LIBRO (CODIGO, TITULO, AUTOR) 
        SELECT DISTINCT 
    	   i.CODIGO, i.TITULO, i.AUTOR
        FROM 
    	   inserted i
        WHERE
    	   NOT EXISTS (SELECT 1 FROM dbo.Libro l WHERE (i.CODIGO = l.CODIGO));
    END
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta yulfredy viernes, 10 de febrero de 2017 21:38
    viernes, 10 de febrero de 2017 20:35
  • Funciona Perfecto

    Muchas gracias..


    Respuesta de foro Microsoft

    viernes, 10 de febrero de 2017 21:38
  •   

    Hola William

    Me podrias por favor indicar que está mal en esta sentencia?, tu solución me funcionó perfecto en su momento pero al modificarla con este join no realiza ninguna acción.

        INSERT INTO ASIGNACION(PERSONA,EQUIPO,CODIGO_ASIGNACION,CIUDAD)
        SELECT DISTINCT
        usu.DOCUMENTO,ELEM.SERIAL,tmp.CODIGO_ASIGNACION,tmp.CIUDAD
        FROM TMP_REGISTROS as tmp inner join PERSONA as usu on usu.DOCUMENTO=tmp.DOCUMENTOS
        inner join EQUIPO as ELEM on ELEM.SERIAL=tmp.SERIALES
        WHERE
        NOT EXISTS (SELECT 1 FROM PERSONA l WHERE (tmp.DOCUMENTOS = l.DOCUMENTO));
        GO

    De esta manera Funciona la primera vez, pero si hay un nuevo registro en la tabla TMP_REGISTROS no lo adiciona

       IF NOT EXISTS( SELECT EQUIPO,PERSONA FROM ASIGNACION (NOLOCK) WHERE EQUIPO = EQUIPO AND           PERSONA=PERSONA )
        BEGIN
        insert into ASIGNACION(PERSONA,EQUIPO,CODIGO_ASIGNACION,CIUDAD)
        select usu.DOCUMENTO,ELEM.SERIAL,tmp.CODIGO_ASIGNACION,tmp.CIUDAD from TMP_REGISTROS as tmp inner join PERSONA as usu on usu.DOCUMENTO=tmp.DOCUMENTOS
        inner join EQUIPO as ELEM on ELEM.SERIAL=tmp.SERIALES      
        END

    Muchas gracias..


    Respuesta de foro Microsoft

    martes, 4 de abril de 2017 17:13
  • Muchas Gracias!! A mi también me ha servido
    domingo, 20 de septiembre de 2020 15:44