Как я могу обновить найденные записи, кроме как в SQL - PullRequest
0 голосов
/ 13 октября 2019

Я сравниваю (в одну сторону) две таблицы разных баз данных в SQL. Я хочу обновить только вторую таблицу с отличиями. Часть сравнения дает мне правильные результаты, но я понятия не имею, как получить эти результаты в части обновления

-- The comparing part DB1 with DB2
    WITH RecordsWithUpdates AS
    (SELECT DeviceID, DeviceName, DeviceNumber, Active FROM DB1.dbo.devices
    EXCEPT
    SELECT DeviceID, DeviceName, DeviceNumber, Active FROM DB2.dbo.devices
    )

    -- displaying the differences
    Select * from DB2.dbo.Devices
    WHERE DeviceID IN (SELECT DeviceID FROM RecordsWithUpdates)

    -- Updating then columns of DB2
    Update DB2.dbo.devices SET DeviceName = ?????, SET DeviceNumber = ??????, Active = ??????? 

Часть кода с ????? где он должен вставить найденные различия, но я не могу заставить его работать.

1 Ответ

1 голос
/ 13 октября 2019

Я бы подошел к этому с синтаксисом UPDATE ... SET ... FROM ... JOIN, например:

UPDATE 
    t2
SET 
    t2.DeviceName   = t1.DeviceName,
    t2.DeviceNumber = t1.DeviceNumber,
    t2.Active       = t1.Active
FROM 
    DB2.dbo.devices t2
    INNER JOIN DB1.dbo.devices t1 
        ON  t1.DeviceID = t2.DeviceID
        AND NOT (
            t1.DeviceName       = t2.DeviceName
            AND t1.DeviceNumber = t2.DeviceNumber
            AND t1.Active       = t2.Active 
        )

Если вы хотите одновременно INSERT записей, которые еще не существуют, вы можете использоватьсинтаксис MERGE вместо:

MERGE DB2.dbo.devices t2 
USING DB1.dbo.devices t1 
ON (t1.DeviceID = t2.DeviceID)
WHEN MATCHED
    THEN UPDATE SET
        t2.DeviceName   = t1.DeviceName,
        t2.DeviceNumber = t1.DeviceNumber,
        t2.Active       = t1.Active
WHEN NOT MATCHED
    THEN INSERT(DeviceID, DeviceName, DeviceNumber, Active)
    VALUES (t1.DeviceID, t1.DeviceName, t1.DeviceNumber, t1.Active)

Наконец: если вы хотите удалить записи, которые существуют в t2, но не в t1, просто добавьте это в конце запроса MERGE:

WHEN NOT MATCHED BY SOURCE
THEN DELETE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...