2016-02-09 89 views
0

需要SQL查询才能在单个语句中执行UPDATE和SELECT。SQL查询加入更新并在单个语句中选择

我有两个表。 首先我需要过滤第二个表 过滤第二个表后,我需要更新结果过滤的第二个表中的第一个表。

更新语句,然后Select语句 SCENARIO

+2

哪'RDBMS'您使用的是 –

+0

可能的复制[更新和在一个查询中选择(http://stackoverflow.com/questions/4057244/update-and-select-in-one-query) –

+0

SQL @ VR46 ..这种情况下不可用 – user5705451

回答

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 

我认为它不会像其他RDBMs一样正常工作。

编辑:添加了哪里到SQL,和下面的说明:

查询的形式为:

update table1 
set col1 = x.colN 
from table1 t 
inner join table2 x on some condition 

这是在两个部分更新+组线,并且从查询这是一个完整的选择语句没有实际的选择列列表。把第二个想象成以'select *'为前缀。

第二部分(select语句的内容)必须使用与更新部分相同的表 - 上述框架中的问题和table1中的FirstTable。由于它选择与更新相同的表中的行,因此它知道要更新哪些行,并使select部分中的列可用于更新部分。在框架中,我可以将table1中的col1设置为table2中的colN。

您的问题有点复杂,因为我不一定要更改名字或姓氏。要取FirstName,我想在FirstName = MiddleName时将FirstName更改为FN。要做到这一点,我使用的情况下,作为集的一部分:

set f.FirstName = case when f.FirstName = s.MiddleName then s.FN else f.FirstName end 

这是说的时候名字=中间名,然后设置姓ØFN,否则将其设置为姓(换句话说,不要改变它)。

为LastName重复。

希望有所帮助。

+0

(FN!= aaa)条件未被提及。你也可以解释查询吗? – user5705451

+0

是的,西蒙只错过了'WHERE s.FN!='aaa''的情况。查询首先执行连接,然后更新第一行中指定的表(您可以简单地使用别名:'update f')。它将所有FirstName字段设置为'case'返回的内容,其逻辑非常简单:根据指定的条件返回's.FN'或'f.FirstName'。 – Andrew

+0

编辑说明并添加缺少的地方(d'oh!) –