Данные обновления SQL Server, если они не существуют из другой таблицы - PullRequest
0 голосов
/ 15 мая 2019

Мне нужно обновить значения в таблице из другой таблицы, и если они не существуют, они должны быть вставлены.Так что я видел этот пример в здесь

UPDATE Table1 SET (...) WHERE Column1='SomeValue'
IF @@ROWCOUNT=0
    INSERT INTO Table1 VALUES (...)

Теперь я хотел бы сделать это, но вместо предложения where со значением мне нужно проверить, совпадают ли столбцы в другой таблице.

Что-то вроде

    UPDATE t1
        SET 
            t1.status = t2.status
        FROM 
            table1 t1, table2 t2
        WHERE t1.reference = t2.reference and t1.section = t2.section

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

РЕДАКТИРОВАТЬ

Также, пожалуйста, если вы можете, я хотел бы услышать, почему ваш подход лучше, чем, например, использование слияния или объединения.Очень признателен.

РЕЗУЛЬТАТ

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

        UPDATE C
        SET 
            C.ConsumoWeek01 = M.ConsumoWeek01
        FROM 
            Consumos AS C 
        INNER JOIN @tempTable M
        ON C.Referencia = M.Referencia 
        AND C.UAP = M.UAP

        INSERT INTO 
            Consumos
        SELECT *
        FROM @tempTable M
        WHERE NOT EXISTS
        (
            SELECT 1 FROM Consumos C
            WHERE C.Referencia = M.Referencia 
            AND C.UAP = M.UAP
        )

Ответы [ 4 ]

1 голос
/ 15 мая 2019

Ваш метод в порядке, просто используйте стандартный явный синтаксис join вместо старого стиля с запятой отдельно:

update t1
     set . . . 
from table t1 inner join
     table t2
     on t1.reference = t2.reference and t1.section = t2.section;
1 голос
/ 15 мая 2019

использование не существует

UPDATE t1
        SET 
            t1.status = t2.status
        FROM 
            table1 t1 where not exists( select 1 from  table2 t2 where t1.=ref=t2.ref and t1.section=t2.secction)
1 голос
/ 15 мая 2019

Использовать оператор слияния:

MERGE INTO Table1 T1 
USING 
(
    SELECT * FROM Table2 
) T2
ON 
(
    T1.reference = T2.reference AND 
    T1.section = T2.section
)
WHEN MATCHED THEN 
--UPDATE STATEMENT 
WHEN NOT MATCHED THEN 
--INSERT STATEMENT  
1 голос
/ 15 мая 2019

Попробуйте это

UPDATE t1
        SET 
            t1.status = t2.status
        FROM 
            table1 t1
        WHERE NOT EXISTS (SELECT 1 FROM  table2 t2
                            WHERE t1.reference = t2.reference 
                                and t1.section = t2.section )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...