我有table1,它有我的初始记录。我的table2
包含与table1
相同的表格结构。 Table2
个事务用于更新table1
个值。
为了说明我想要做的事情,我有这个代码,当它们为null时,它可以很好地用于字段:
UPDATE TABLE1
SET FIELD1 = CASE WHEN T1.FIELD1 = '' THEN t2.FIELD1 ELSE T1.FIELD1 END,
FIELD2 = CASE WHEN T1.FIELD2 = '' THEN T2.FIELD2 ELSE T1.FIELD2 END,
FIELD3 = CASE WHEN T1.FIELD3 = '' THEN T2.FIELD3 ELSE T1.FIELD3 END,
FROM TABLE1 T1
JOIN TABLE2 T2 ON T1.COMMONFIELD = T2.COMMONFIELD
GO
但是有没有办法做同样的事情,但是将t1.field1
值与t2.field1
值进行比较并使用相同的逻辑?这将是具有类似代码的概念:
UPDATE TABLE1
SET FIELD1 = CASE WHEN T1.FIELD1 > t2.field1 THEN t2.FIELD1 ELSE T1.FIELD1 END,
FIELD2 = CASE WHEN T1.FIELD2 < t2.field2 THEN T2.FIELD2 ELSE T1.FIELD2 END,
FIELD3 = CASE WHEN T1.FIELD3 = '' THEN T2.FIELD3 ELSE T1.FIELD3 END,
FROM TABLE1 T1
JOIN TABLE2 T2 ON T1.COMMONFIELD = T2.COMMONFIELD
GO
我希望能够将t1.field-n
值与t2.field-n
值进行比较,其中每个值在更新之前都有自己的比较标准。如果不是这种方法,可以用另一种方式使用T-SQL吗?
谢谢!
答案 0 :(得分:0)
这不是一个完全答案,但我希望您的第一个查询是:
UPDATE T1
SET FIELD1 = COALESCE(T2.FIELD1, T1.FIELD1),
FIELD2 = COALESCE(T2.FIELD2, T1.FIELD2),
FIELD3 = COALESCE(T2.FIELD3, T1.FIELD3)
FROM TABLE1 T1 JOIN
TABLE2 T2
ON T1.COMMONFIELD = T2.COMMONFIELD;
当TABLE1
中的相应字段为TABLE2
时,这将更新NOT NULL
。我不确定你的问题的其余部分是什么,但你也可以让第一个查询做一些合理的事情。
答案 1 :(得分:0)
我不确定以下内容是否会对您有所帮助:
declare @t1 table (val1 varchar(100), val2 varchar(100), common_field int)
declare @t2 table (val1 varchar(100), val2 varchar(100), common_field int)
insert into @t1
select 'abc', 'first', 1 union select '', 'second', 2 union select 'xyz', '', 3 union select '', '', 4
insert into @t2
select '', 'NEW_FIRST', 1 union select 'NEW', 'NEW_2', 2 union select 'not_old', 'NEW_SECOND', 3 union select 'PQR_NEW', 'ALL_NEW', 4
select t1.common_field, t1.val1 val1_1, t2.val1 val1_2,
coalesce(nullif(t1.val1, ''), t2.val1) update_value_for_val1,
t1.val2 val2_1, t2.val2 val2_2,
coalesce(nullif(t1.val2, ''), t2.val2) update_value_for_val2
from @t1 t1
join @t2 t2 on t1.common_field = t2.common_field
order by 1
感谢。