SQL查询在单个语句中加入更新和选择

时间:2016-02-09 16:39:05

标签: sql

需要SQL查询才能在单个语句中执行UPDATE和SELECT。

我有两张桌子。 首先,我需要过滤第二个表 过滤第二个表后,我需要从生成的过滤后的第二个表中更新第一个表。

更新语句后跟Select语句 SCENARIO

1 个答案:

答案 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。

希望有所帮助。