我有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。
我遇到了这个问题。有什么想法吗?
谢谢,
答案 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
以下是解决方案
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
注意:如果#tempForT包含新值(行),则不会插入那些行,因为您必须使用 WHEN NOT MATCHED 更新合并语句那个案子插入新记录。