2016-02-09 128 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!) –