仅当源数据不为空且不同时才更新目标表

时间:2017-04-19 20:04:27

标签: sql sql-server tsql join

我有2个具有相同列的表。第一个表Temp1加载了sp并且是临时的。它用于在生产环境中加载表T1。例如,我有这些数据:

Table Temp1 


Id  Col1    Col2    Col3    Col4    Col5
2   null    null    0.5     null    0.6
3   0.1     null    null    null    null


Table T1 

Id  Col1    Col2    Col3    Col4    Col5
1   2        3       0.4       5    0.6
2   5        4         6       4    7
3   8        9         7       10   1

只有当Temp1中的列不为空并且T1中的值不相同(我的示例中为粗体值)时,才需要使用Temp1中的数据更新T1。

我遇到了这个问题。有什么想法吗?

谢谢,

3 个答案:

答案 0 :(得分:2)

使用带有case表达式的update语句就是这样的。

update tt1
    set Col1 = case when T.Col1 is not null and T.Col1 <> tt1.Col1 then T.Col1 else tt1.Col1 end
from T1 tt1
join Temp1 t on t.Id = tt1.Id

答案 1 :(得分:1)

UPDATE T1
  SET T1.Col1 = ISNULL(NULLIF(ISNULL(tmp.Col1 , T1.Col1) , T1.Col1) , T1.Col1)
   ,  T1.Col2 = ISNULL(NULLIF(ISNULL(tmp.Col2 , T1.Col2) , T1.Col2) , T1.Col2)
   ,  T1.Col3 = ISNULL(NULLIF(ISNULL(tmp.Col3 , T1.Col3) , T1.Col3) , T1.Col3)
   ,  T1.Col4 = ISNULL(NULLIF(ISNULL(tmp.Col4 , T1.Col4) , T1.Col4) , T1.Col4)
   ,  T1.Col5 = ISNULL(NULLIF(ISNULL(tmp.Col5 , T1.Col5) , T1.Col5) , T1.Col5)
FROM Temp1 tmp
INNER JOIN T1   ON t1.ID = tmp.ID

答案 2 :(得分:0)

您可以针对此问题使用合并语句。

CREATE TABLE #t
    (
        ID int IDENTITY(1,1),
        Name NVARCHAR(50),
        Salary DECIMAL(10,2)
    )

INSERT INTO #t (Name, Salary) VALUES('abc', 123.4)
INSERT INTO #t (Name, Salary) VALUES('pqa', 127.4)
INSERT INTO #t (Name, Salary) VALUES('xyz', 233.4)


CREATE TABLE #tempForT
(
    ID int IDENTITY(1,1),
    Name NVARCHAR(50),
    Salary DECIMAL(10,2)
)

INSERT INTO #tempForT (Name, Salary) VALUES('abc', 200.4)
INSERT INTO #tempForT (Name, Salary) VALUES('pqa', 200.4)
INSERT INTO #tempForT (Name, Salary) VALUES('xyz', NULL)

SELECT * FROM #t
SELECT * FROM #tempForT

enter image description here

以下是解决方案

MERGE #t AS DestTable
USING (
        SELECT 
            NAME,
            Salary
        FROM #tempForT
    )SourceTable
    ON DestTable.Name = SourceTable.Name        --Should contain columns like composite primary key
    --AND other columns
WHEN MATCHED
    THEN
        UPDATE 
            SET DestTable.Salary = ISNULL(SourceTable.Salary, DestTable.Salary) --checking for NULL
        ; 

SELECT * FROM #t

enter image description here

注意:如果#tempForT包含新值(行),则不会插入那些行,因为您必须使用 WHEN NOT MATCHED 更新合并语句那个案子插入新记录。