2017-04-19 10 views
2

同じ列を持つ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から列がnullではなく、T1(私の例の太字の値)で同じ値を持っていない場合にのみ、TEMP1からのデータとT1を更新する必要があります。

私はこの問題を抱えています。どんなアイデアですか?

おかげで、

+1

2つのテーブルを結合する結合ステートメントと、各列のケース式を使用します。 –

+0

あなたの答えを詳述し、彼が更新ステートメントでどのように参加することができるか説明してください。 – TheEsnSiavashi

+2

http://stackoverflow.com/questions/2334712/how-to-update-from-a-select-in-sql-server – nscheaffer

答えて

2

ケース式に更新ステートメントを使用すると、このようなものになるだろう。

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 
+0

これはとても明白です...ありがとうございます!あなたは私の一日を保存:) – user3463579

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 
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は、新しい値(行)が含まれている場合は、それらの行を取得することはありませんあなたのためにそれを挿入する必要がありますeマージステートメントと一致しない場合は新しいレコードを挿入します。