首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL UPDATE 關聯查詢寫法大全:標準語法、跨數據庫差異、JOIN 更新與集合賦值模式

     編輯:關於SqlServer

標準單表更新

UPDATE TableA SET Col1 = Val1, Col2 = Val2 WHERE Condition;

從 SELECT 結果集賦值:集合賦值語法(Oracle/DB2/PostgreSQL)

UPDATE TableB
SET (Col1, Col2, Col3) = (SELECT Val1, Val2, Val3 FROM TableA WHERE TableA.Id = TableB.Id)
WHERE EXISTS (SELECT 1 FROM TableA WHERE TableA.Id = TableB.Id);

⚠️ SQL Server 不支持此語法,會報錯。

SQL Server / Sybase 專用:UPDATE ... FROM ... JOIN

-- 隱式連接 (舊風格)
UPDATE B SET B.ClientName = A.Name FROM TableA A, TableB B WHERE A.Id = B.Id;

-- 顯式 JOIN (推薦,可 LEFT/RIGHT/INNER)
UPDATE B
SET B.ClientName = A.Name
FROM TableB B
LEFT JOIN TableA A ON A.Id = B.Id;

-- 多表更新同步
UPDATE A
SET A.Col1 = B.Col1, A.Col2 = B.Col2
FROM TableA A
INNER JOIN TableB B ON A.Id = B.Id
WHERE A.Status = 1;

優勢:單次掃描源表,避免 WHERE 和 SET 子查詢各掃描一次,性能顯著優於子查詢寫法。

Oracle/DB2 兼容寫法

UPDATE TableB
SET (Col1, Col2) = (SELECT Val1, Val2 FROM TableA WHERE TableA.Id = TableB.Id)
WHERE Id IN (SELECT Id FROM TableA WHERE TableA.Id = TableB.Id);

跨數據庫更新(Linked Server)

UPDATE LocalDB.dbo.TableB
SET Col1 = Remote.Col1
FROM LocalDB.dbo.TableB B
INNER JOIN [LinkedSvr].RemoteDB.dbo.TableA A ON A.Id = B.Id;

UPDATE 關聯 DELETE 同理

DELETE B FROM TableB B
LEFT JOIN TableA A ON A.Id = B.Id
WHERE A.Id IS NULL; -- 刪除 B 中無對應 A 的行

最佳實踐總結

場景推薦寫法避坑提示
SQL Server 單表關聯更新UPDATE ... FROM ... JOIN別用子查詢 SET,雙掃描慢
Oracle/PostgreSQL 集合賦值SET (c1,c2) = (SELECT ...)需 WHERE EXISTS 防 NULL 覆蓋
大批量更新分批次 (TOP 5000) 循環避免長事務、鎖升級、日志暴漲
需回滾保障顯式事務包裹隱式事務單語句自動提交
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved