Проверка существования строки перед выполнением выбора в (SQL Server)
-
30-09-2019 - |
Вопрос
У меня есть заявление SQL, которое я хотел бы внести поправки. В настоящее время я запускаю простой Select Into, но я хотел бы изменить его, поэтому добавляются только записи, которые не существуют в таблице назначения (как определено моими критериями).
Вот мое первоначальное утверждение:
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())
Я хотел бы изменить ситуацию, чтобы заполненная стадия была заполнена только тогда, когда бюллетень уже не существует. Является ли это приемлемым способом сделать это, или есть лучшие альтернативы?
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)) )
Решение
Ваша техника выглядит хорошо, за исключением того, что Выберите ... в Синтаксис используется для создания совершенно новой таблицы. Вместо этого вы хотели бы использовать приведенный ниже код, чтобы добавить строки в существующую таблицу:
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)
Другие советы
SELECT INTO
Создает новую таблицу, а не вставить данные в существующую таблицу. Из -за этого я бы проверил, существует ли таблица, если она это сделает, отбросьте таблицу, прежде чем запустить существующий SQL. Будет гарантировать, что StagingTable сбрасывается и воссоздается каждый раз.
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())
Если вы хотите добавить строки в существующую таблицу, вам следует использовать INSERT INTO
Согласно ответу Джо Стефанелли.