2012-06-04 86 views
1

Possible Duplicate:
How to update two tables in one statement in SQL Server 2005?如何更新單查詢兩個表中的SQL Server 2008

我有兩個表,並需要更新一個表並生效的其他表。

這兩個表通過關係

t1.col1 PK , t2.col1 FK 

t1    t2 
_____________ _____________ 
|col1| col2| |col1 |col2 |    
|----|------| |-----|-----|        
|1 | a | | 1 | d |    
|2 | b | | 2 | e |    
|3 | c | | 3 | f |    
|____|______| |_____|_____| 

我如何更新在SQL Server 2008中一個查詢這兩個表的鏈接?

我想要做這樣的事情

Update College 
Inner Join Class ON College.CollegeId = Class.CollegeId 
set College.CollegeId = '33333333-3333-3333-3333-333333333333', 
    Class.CollegeId = '33333333-3333-3333-3333-333333333333' 
where 
    College.CollegeId = '071887ea-3c93-40ce-a112-3b849d352064' 

,但我得到一個錯誤:

incorrect syntax near the keyword "Inner"

+1

爲什麼不直接在事務中創建兩個更新語句? – rikitikitik

+0

與@AlanKuras同意。還有在2008年和2005年SQL在這個問題上沒有什麼區別 –

+0

開始交易,UDPATE表1,表2更新,提交。更簡單,更mantainable,不容易出錯 – Alex

回答

2

無論您更新2代表一個聲明在一個查詢的一個連接或2臺在一個連接上一個查詢兩種說法,實在是同樣的事情。

您可以設置參數傳遞給腳本,那麼你只需要一次發送的值,並運行該腳本一次,這將反過來只使用一個連接。

declare @OldCollegeID 
declare @NewCollegeID 

Update Class set CollegeID = @NewCollegeID 
where CollegeID = @OldCollegeID 

Update College set CollegeID = @NewCollegeID 
where CollegeID = @OldCollegeID 

不過,我猜你想同時放這樣做的原因是因爲你不能沒有更新,因爲關係類先更新大學?嘗試更新College.CollegeID將導致錯誤,因爲外鍵Class.CollegeID。反之亦然。 Class.CollegeID不會更新,除非你正在更新的Class.CollegeID在College.CollegeID存在。在這種情況下,我會建議如下:

Create Procedure UpdateCollegeID 
(
    declare @OldCollegeID varchar(100), 
    declare @NewCollegeID varchar(100) 
) 

as 

declare @CollegeName varchar(100) 
declare @ClassName varchar(100) 

set @CollegeName = (select CollegeName from College where CollegeID = @OldCollegeID) 
set @ClassName = (select ClassName from Class where CollegeID = @OldCollegeID) 

Insert into College (CollegeID, CollegeName) 
Values(@NewCollegeID, @NewCollegeName) 

Insert into Class (ClassID, CollegeID) 
Values(@ClassID, @NewCollegeID, @ClassName) 

Delete from Class where CollegeID = @OldCollegeID 
Delete from College where CollegeID = @OldCollegeID 

這將更新與新的ID的所有您的大學記錄,你不會有後顧之憂。您可能需要在前端應用程序中採取不同的操作,以根據具體情況進行調整。保存一個存儲過程將允許您執行它,並且所有內容都將更新爲傳遞的參數。

希望這會有所幫助。

謝謝 J

+0

Thaaxn很多Mr.Joachim, –

+0

快樂伴侶,請評價答案或標記爲接受答案,如果它有幫助。謝謝J –

-2

你可以做類似下面

UPDATE T1 INNER JOIN T2 ON T1.COL1 = T2.COL1 SET T1.COL2 = 'X', T2.COL2= 'Y' 
WHERE T1.COL1 = 2 

編碼愉快!

+0

這部作品MSSQL? –

+0

是的這個作品,我在以前的項目中的許多地方使用它 – Ravia

+0

它不工作,關鍵字「Inner」附近的語法不正確 我想做類似的事 更新College Inner Join Class ON College.CollegeId = Class。 CollegeId set College.CollegeId ='33333333-3333-3333-3333-333333333333', Class.CollegeId ='33333333-3333-3333-3333-333333333333'其中College.CollegeId ='071887ea-3c93-40ce-a112-3b849d352064' –

2

你這樣做:
你可以使用一個事務兩個確保兩個UPDATE語句被處理正確。

BEGIN TRANSACTION 

UPDATE Table1 
    SET Table1.col1= 'XXXX' 
FROM Table1 T1, Table2 T2 
WHERE T1.id = T2.id 
and T1.id = '010008' 

UPDATE Table2 
SET Table2.col1 = 'XXXX' 
FROM Table1 T1, Table2 T2 
WHERE T1.id = T2.id 
and T1.id = '010008' 

COMMIT

+0

這適用於MSSQL? –

+0

我想有人應該閱讀UPDATE命令的Transact-SQL語法! –

+0

不要更新主鍵。如果您有任何其他表引用它,它可能會導致很多問題讓您的數據保持不變。 理想情況下,如果您想要一個可更新的唯一字段,請創建一個新字段。 –