2010-10-13 1 views
1

J'ai une instruction SQL que je voudrais modifier. À l'heure actuelle, je lance un simple SELECT INTO mais je voudrais le modifier afin que seuls les enregistrements qui n'existent pas dans la table de destination (comme déterminé par mes critères) soient ajoutés.vérification de l'existence d'une ligne avant de faire un SELECT INTO (SQL Server)

Voilà 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 de s'y prendre, ou existe-t-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))) 
+2

Sans indications supplémentaires de verrouillage, vous pouvez toujours obtenir des doublons en cas de charge élevée. Voir [Question connexe] (http://stackoverflow.com/questions/3407857/only-inserting-a-row-if-its-not-already-there) –

Répondre

2

Votre technique semble bon, sauf que la syntaxe SELECT...INTO 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) 
+0

Merci d'avoir saisi mon SQL, et pour la confirmation sur EXISTS. Le code actuel est SELECT dans une table temporaire, pour un traitement ultérieur. L'idée est de limiter le nombre de lignes dans la table temporaire. Désolé pour le slipup dans mon message, j'essayais d'amincir la déclaration SQL pour une visualisation plus facile! – larryq

1

SELECT INTO crée une nouvelle table plutôt que Insérer des données dans une table existante. A cause de cela, je vérifierais si la table existe, si c'est le cas, alors déposez la table avant d'exécuter votre SQL existant. La volonté assurera que le StagingTable est abandonné et recréé à 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.

Questions connexes