首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MSSQL 三表關聯更新:將表1字段2替換為表3字段1

     編輯:程式設計綜合問答

問題描述

有三張表,結構如下:

  • 表1:字段1(uuu)、字段2(bbb)
  • 表2:字段1(uuu)、字段2(ddd)
  • 表3:字段1(aaa)、字段2(ddd)

關聯關係:

  1. 表1.字段1 = 表2.字段1
  2. 表2.字段2 = 表3.字段2

目標:通過 MSSQL 語句,將表1的字段2更新為表3的字段1。

解決方案

使用 UPDATE 配合子查詢實現多表關聯更新:

UPDATE 表1
SET 字段2 = (
    SELECT TOP 1 表3.字段1
    FROM 表2
    INNER JOIN 表3 ON 表2.字段2 = 表3.字段2
    WHERE 表2.字段1 = 表1.字段1
)
WHERE EXISTS (
    SELECT 1
    FROM 表2
    INNER JOIN 表3 ON 表2.字段2 = 表3.字段2
    WHERE 表2.字段1 = 表1.字段1
);

關鍵點解析

  1. 使用 INNER JOIN 替代舊式逗號連接:語義更清晰,避免笛卡爾積風險。
  2. TOP 1 保證單值返回:防止子查詢返回多行導致錯誤(假設業務上唯一)。
  3. WHERE EXISTS 子句:只更新有匹配記錄的行,避免將無匹配行的字段2設為 NULL。

替代寫法:使用 MERGE(MSSQL 2008+)

MERGE INTO 表1 AS Target
USING (
    SELECT 表1.字段1 AS KeyCol, 表3.字段1 AS NewVal
    FROM 表1
    INNER JOIN 表2 ON 表1.字段1 = 表2.字段1
    INNER JOIN 表3 ON 表2.字段2 = 表3.字段2
) AS Source
ON Target.字段1 = Source.KeyCol
WHEN MATCHED THEN
    UPDATE SET Target.字段2 = Source.NewVal;

MERGE 語句在處理複雜更新邏輯時更具可讀性和性能優勢。

注意事項

  • 執行前請備份數據,或先用 SELECT 驗證關聯結果。
  • 確保關聯字段有索引,提升大數據量下的執行效率。
  • 若表3.字段1可能為 NULL,需根據業務決定是否允許更新為 NULL。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved