Проверка существования строки перед выполнением выбора в (SQL Server)

StackOverflow https://stackoverflow.com/questions/3927681

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top