答案 0 :(得分:2)
您还没有告诉我们您的数据库是什么,但这适用于SQL Server。
update FirstTable
set f.FirstName = case when f.FirstName = s.MiddleName then s.FN else f.FirstName end,
f.LastName = case when f.LastName = s.MiddleName then s.FN else f.LastName end
from FirstTable f
inner join SecondTable s on f.FirstName = s.MiddleName or f.LastName = s.MiddleName
where s.FN <> 'aaa' -- Missed first time
我认为它不会像其他RDBM那样完全正常工作。
编辑:添加了SQL的位置和后面的解释:
查询格式为:
update table1
set col1 = x.colN
from table1 t
inner join table2 x on some condition
这是update + set行的两部分,而from查询是一个没有实际select列列表的完整select语句。把第二个想象为带有'select *'的前缀。
第二部分(select语句的内容)必须使用与更新部分相同的表 - 问题中的FirstTable和上面骨架中的table1。由于它从更新中选择与同一个表中的行,因此它知道要更新哪些行,并使更新部分中的列可用于更新部分。在骨架中,我可以将table1中的col1从table2设置为colN。
您的问题有点复杂,因为我不一定要更改FirstName或LastName。要获取FirstName,我想在FirstName = MiddleName时将FirstName更改为FN。为此,我使用案例作为集合的一部分:
set f.FirstName = case when f.FirstName = s.MiddleName then s.FN else f.FirstName end
这表示当FirstName = MiddleName然后将FirstName设置为FN,否则将其设置为FirstName(换句话说不要更改它)。
重复LastName。
希望有所帮助。