2010-10-13 3 views
1

У меня есть оператор SQL, который я бы хотел изменить. В настоящее время я запускаю простой SELECT INTO, но я бы хотел его изменить, поэтому добавляются только записи, которые не существуют в таблице назначения (как определено моими критериями).проверка существования строки перед выполнением SELECT INTO (SQL Server)

Вот мое первоначальное заявление:

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()) 

Я хотел бы изменить положение вещей, так что StagingTable заполняется только тогда, когда голосование уже не существует. Является ли это приемлемым способом для этого, или есть лучшие альтернативы?

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

Без дополнительных указаний на блокировку вы все равно можете получить дубликаты под большой нагрузкой. См. [Связанный вопрос] (http://stackoverflow.com/questions/3407857/only-inserting-a-row-if-its-not-already-there) –

ответ

2

Ваша техника выглядит хорошо, за исключением, что синтаксис SELECT...INTO используется для создания совершенно новой таблицы. Вместо этого, вы хотели бы использовать код, приведенный ниже, чтобы добавить строки в существующую таблицу:

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

Спасибо, что поймали мой SQL, и для подтверждения на EXISTS. Фактический код - SELECT IN IN в таблице temp, для последующей обработки. Идея состоит в том, чтобы ограничить количество строк в таблице temp. Извините за slipup в моем посте, я пытался уменьшить инструкцию SQL для упрощения просмотра! – larryq

1

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 в соответствии с Джо Стефанелли ответ.

Смежные вопросы