SQL Server 的 UPDATE ... FROM 語法支援跨表關聯更新,但對別名使用有嚴格限制。本文從基礎更新延伸至多表 JOIN 更新、自我關聯更新,深度解析別名規則與實戰陷阱。
UPDATE Ttest
SET statusInd = 'ACTIVE'
WHERE id = 123;
規則: UPDATE 後的資料表名稱不可使用別名,WHERE 條件中的欄位自動屬於該表。
UPDATE Ttest
SET statusInd = 'ACTIVE'
FROM Tparent parent
WHERE Ttest.id = 123
AND Ttest.parentId = parent.id
AND parent.statusInd = 'ACTIVE';
UPDATE Ttest 後不可加別名。FROM 子句中的資料表可使用別名 (如 parent)。UPDATE 目標表的欄位,必須加上表名稱前綴 (如 Ttest.id),否則無法區分同名欄位。UPDATE Ttest
SET statusInd = 'ACTIVE'
FROM Ttest parent, -- 父節點角色 (需別名)
Ttest -- 子節點角色 (無別名,對應 UPDATE 目標)
WHERE Ttest.id = 123
AND Ttest.parentId = parent.id
AND parent.statusInd = 'ACTIVE';
UPDATE Ttest 目標表 = 子節點 (無別名)。FROM Ttest parent = 父節點 (必須有別名區隔)。FROM Ttest (無別名) = 重新宣告目標表,讓 JOIN 條件能正確繫結。Ttest.parentId = parent.id 建立自我關聯。| 錯誤寫法 | 問題 | 正確寫法 |
|---|---|---|
| UPDATE 後加別名 | UPDATE Ttest SET ... |
|
| 同名欄位模糊 | WHERE Ttest.id = 123 | |
| 目標表缺無別名宣告 | FROM 子句需包含無別名的目標表 |
WITH cte AS (...) UPDATE t SET ... FROM cte ...SELECT 驗證 JOIN 條件與影響範圍。深入理解 UPDATE ... FROM 的別名規則與自我關聯邏輯,能精準處理複雜的階層式資料更新需求。