Pregunta

Tengo una instrucción SQL que me gustaría modificar. Tal como está ahora estoy corriendo un simple SELECT INTO, pero me gustaría modificarlo de forma que sólo los registros que no existen en la tabla de destino (según lo determinado por mi criterio) se anexan.

Aquí está mi declaración inicial:

SELECT b.BallotID, m.MeetingDate
    INTO StagingTable
    FROM Ballot INNER JOIN Meeting on b.MeetingID = m.MeetingID
    WHERE b.LastModifiedDate < '01-01-2010' AND ( b.BallotType = 'Agenda Vote' AND m.MeetingDate < GETDATE())  

Me gustaría cambiar las cosas para que el StagingTable sólo se llena cuando la papeleta no existe ya. ¿Es esta una forma aceptable de hacer las cosas, o hay alternativas mejores?

SELECT b.BallotID, m.MeetingDate
    INTO StagingTable
    FROM Ballot INNER JOIN Meeting on b.MeetingID = m.MeetingID
    WHERE b.LastModifiedDate < '01-01-2010' AND ( b.BallotType = 'Agenda Vote' AND m.MeetingDate < GETDATE())   
    AND NOT EXISTS(SELECT 1 from StagingTable where BallotID = b.BallotID)) )
¿Fue útil?

Solución

Su técnica se ve bien, excepto que el SELECT ... INTO sintaxis se utiliza para crear una nueva mesa. En su lugar, te gustaría usar el siguiente código para agregar filas a una tabla existente:

INSERT INTO StagingTable
    (BallotID, MeetingDate)
    SELECT b.BallotID, m.MeetingDate
        FROM Ballot b
            INNER JOIN Meeting m
                on b.MeetingID = m.MeetingID
        WHERE b.LastModifiedDate < '01-01-2010' 
            AND (b.BallotType = 'Agenda Vote' AND m.MeetingDate < GETDATE())   
            AND NOT EXISTS(SELECT 1 from StagingTable where BallotID = b.BallotID)

Otros consejos

SELECT INTO crea una nueva tabla en lugar de los datos de inserción en una tabla existente. Debido a esto me gustaría comprobar si la tabla existe, si lo hace entonces eliminar la tabla antes de ejecutar SQL existente. La asegurará que el StagingTable se cae y vuelve a crear cada vez.

    IF OBJECT_ID('StagingTable','U') IS NOT NULL
    BEGIN
         DROP TABLE StagingTable
    END


        SELECT b.BallotID, m.MeetingDate
        INTO StagingTable
        FROM Ballot INNER JOIN Meeting on b.MeetingID = m.MeetingID
        WHERE b.LastModifiedDate < '01-01-2010' AND ( b.BallotType = 'Agenda Vote' 
        AND m.MeetingDate < GETDATE()) 

Si desea agregar filas a la tabla existente, entonces debería usar INSERT INTO según respuesta Joe Stefanelli.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top