首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server 跨表更新實戰:FROM + JOIN 更新多欄位,一對多與多對一語意陷阱

     編輯:MySQL 資料庫相關知識

需求:單一 UPDATE 陳述式,依關聯鍵從表 B 更新表 A 的三個欄位。關鍵在於正確使用 FROM + JOIN 並理解一對多/多對一語意差異。

標準語法範本

USE tempdb
GO
CREATE TABLE #t1 (c1 INT NOT NULL, c2 CHAR(5), c3 CHAR(5), c4 CHAR(5))
CREATE TABLE #t2 (c1 INT NOT NULL, c2 CHAR(5), c3 CHAR(5), c4 CHAR(5))
GO

INSERT #t1 VALUES (1, 'hello', 'there', 'fred')
INSERT #t2 VALUES (1, 'how', 'are', 'you?')
GO

-- 跨表更新
UPDATE #t1
SET #t1.c2 = #t2.c2,
    #t1.c3 = #t2.c3,
    #t1.c4 = #t2.c4
FROM #t2
WHERE #t1.c1 = #t2.c1

SELECT * FROM #t1  -- 結果: c2=how, c3=are, c4=you?

關鍵規則與陷阱

1. 一對多 (目標表單列對應來源表多列) → 不可預測

  • SQL Server 取「最後找到的那一列」更新,但平行查詢下「最後」不確定。
  • **嚴禁**在更新中使用一對多關聯,除非來源表有唯一索引保證一對一。

2. 多對一 (目標表多列對應來源表單列) → 安全

  • 所有目標列更新為相同來源值,結果確定。

3. 別名規則

  • 目標表若在 FROM 中僅出現一次,可省略別名。
  • 出現多次時,**僅一處可省略別名**,其餘**必須加別名**。

實戰檢核清單

  1. 確認關聯鍵在來源表唯一 (或已去重)。
  2. 優先寫成 UPDATE A SET ... FROM A JOIN B ON ... 形式。
  3. 若來源需聚合/去重,先用 CTE/子查詢產生唯一來源集合再 JOIN。
  4. 測試平行度為 1 與 >1 時結果一致性。

總結

UPDATE ... FROM ... JOIN ... 是跨表更新標準寫法。**核心風險在於一對多關聯導致非確定性更新**。嚴格保證來源唯一性,並善用 CTE 預處理來源資料,才能安心使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved