vérifier l'existence d'une ligne avant de faire un SELECT INTO (SQL Server)
-
30-09-2019 - |
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)) )
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.