проверка существования строки перед выполнением SELECT INTO (SQL Server) - PullRequest
1 голос
/ 14 октября 2010

У меня есть оператор 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())  

Я хотел бы изменить положение вещей так, чтобы 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 ]

2 голосов
/ 14 октября 2010

Ваша техника выглядит хорошо, за исключением того, что синтаксис 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)
1 голос
/ 14 октября 2010

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

...