la verifica dell'esistenza di una riga prima di fare un SELECT INTO (SQL Server)
-
30-09-2019 - |
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)) )
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.