comprobación de la existencia de una fila antes de hacer un SELECT INTO (SQL Server)
-
30-09-2019 - |
Pregunta
Tengo una instrucción SQL que me gustaría modificar. Tal como está ahora estoy corriendo un simple SELECT INTO, pero me gustaría modificarlo de forma que sólo los registros que no existen en la tabla de destino (según lo determinado por mi criterio) se anexan.
Aquí está mi declaración inicial:
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())
Me gustaría cambiar las cosas para que el StagingTable sólo se llena cuando la papeleta no existe ya. ¿Es esta una forma aceptable de hacer las cosas, o hay alternativas mejores?
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)) )
Solución
Su técnica se ve bien, excepto que el SELECT ... INTO sintaxis se utiliza para crear una nueva mesa. En su lugar, te gustaría usar el siguiente código para agregar filas a una tabla existente:
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)
Otros consejos
SELECT INTO
crea una nueva tabla en lugar de los datos de inserción en una tabla existente. Debido a esto me gustaría comprobar si la tabla existe, si lo hace entonces eliminar la tabla antes de ejecutar SQL existente. La asegurará que el StagingTable se cae y vuelve a crear cada vez.
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 desea agregar filas a la tabla existente, entonces debería usar INSERT INTO
según respuesta Joe Stefanelli.