Question

J'ai une instruction SQL Je voudrais modifier. À l'heure actuelle, je suis en cours d'exécution d'un simple SELECT INTO mais je voudrais le modifier de sorte que seuls les enregistrements qui n'existent pas dans le tableau de destination (tel que déterminé par mes critères) sont joints en annexe.

Voici ma déclaration initiale:

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

Je voudrais changer les choses afin que le StagingTable est peuplé uniquement lorsque le bulletin de vote n'existe pas déjà. Est-ce une façon acceptable d'aller à ce sujet, ou y at-il de meilleures alternatives?

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)) )
Était-ce utile?

La solution

Votre technique semble bon, sauf que le SELECT ... INTO la syntaxe est utilisée pour créer une table de marque nouvelle. Au lieu de cela, vous voulez utiliser le code ci-dessous pour ajouter des lignes à une table existante:

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)

Autres conseils

SELECT INTO crée une nouvelle table plutôt que d'insérer des données dans une table existante. A cause de cela, je voudrais vérifier si la table existe si elle ne descend alors la table avant de lancer votre SQL existante. Le veillera à ce que la StagingTable est supprimée et recréée à chaque fois.

    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 vous voulez ajouter des lignes à la table existante, vous devez utiliser INSERT INTO comme par réponse Joe Stefanelli.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top