如果其他表中不存在SQL Server更新数据

时间:2019-05-15 10:31:11

标签: sql-server

我需要从另一个表更新一个表中的值,如果不存在,则必须将其插入。所以我在here

中看到了这个例子
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 个答案:

答案 0 :(得分:1)

尝试一下

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 )

答案 1 :(得分:1)

不存在

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)

答案 2 :(得分:1)

使用合并语句:

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  

答案 3 :(得分:1)

您的方法很好,只需使用标准的显式join语法而不是用逗号分隔的旧样式即可:

update t1
     set . . . 
from table t1 inner join
     table t2
     on t1.reference = t2.reference and t1.section = t2.section;