Domanda

Ho un'istruzione SQL che vorrei modificare. Così com'è ora sto correndo un semplice SELECT INTO ma mi piacerebbe modificarlo in modo solo i record che non esistono nella tabella di destinazione (come determinato dai miei criteri) vengono aggiunti.

Ecco la mia affermazione iniziale:

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())  

Mi piacerebbe cambiare le cose in modo che lo StagingTable è popolato solo se il voto non esiste già. È questo un modo accettabile di andare su di esso, o ci sono alternative migliori?

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)) )
È stato utile?

Soluzione

La tua tecnica guarda bene tranne che il SELECT ... INTO sintassi viene utilizzato per creare un nuovo tavolo. Invece, che ci si vuole utilizzare il codice sottostante per aggiungere righe a una tabella esistente:

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)

Altri suggerimenti

SELECT INTO crea una nuova tabella, piuttosto che inserire i dati in una tabella esistente. A causa di questo vorrei verificare se la tabella esiste, se lo fa poi cadere il tavolo prima di eseguire il vostro SQL esistente. La farà in modo che lo StagingTable viene eliminato e ricreato ogni volta.

    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()) 

Se si desidera aggiungere righe alla tabella esistente allora si dovrebbe usare INSERT INTO come da Joe Stefanelli risposta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top