在資料庫開發與維護中,UPDATE 語句是最常用的 DML 操作之一。然而,DB2、Oracle 和 SQL Server 三大主流資料庫在多表更新、子查詢賦值等進階語法上卻存在顯著差異。掌握這些差異,能幫助開發人員編寫可移植、高效能的 SQL 程式碼,避免遷移專案時踩坑。
Oracle 和 DB2 都支援 ANSI SQL 標準的「行建構子」寫法,可一次更新多個欄位,語法簡潔直觀:
UPDATE A
SET (A1, A2, A3) = (SELECT B1, B2, B3 FROM B WHERE A.ID = B.ID);
此寫法將子查詢結果直接對應到目標欄位元組,程式碼可讀性極高,維護成本低。
SQL Server 不支援上述行建構子語法,但提供更靈活的 FROM 子句配合 JOIN 實現同等功能:
UPDATE A
SET A1 = B1, A2 = B2, A3 = B3
FROM A
LEFT JOIN B ON A.ID = B.ID;
或使用舊式逗號連接語法(不推薦新專案使用):
UPDATE A
SET A1 = B1, A2 = B2, A3 = B3
FROM A, B
WHERE A.ID = B.ID;
SQL Server 的 FROM 子句支援完整的 JOIN 類型(INNER、LEFT、RIGHT、FULL),並可引用多張表,彈性遠超行建構子,適合複雜業務邏輯。
若在 Oracle/DB2 中需依多表關聯更新,需結合 WHERE EXISTS 或 WHERE IN 確保只更新有匹配記錄的行:
UPDATE A
SET (A1, A2, A3) = (SELECT B1, B2, B3 FROM B WHERE A.ID = B.ID)
WHERE ID IN (SELECT B.ID FROM B WHERE A.ID = B.ID);
此寫法雖能達標,但子查詢重複、效能較差,且易因子查詢返回多行報錯(ORA-01427 / SQL0811),實務上常改用 MERGE 陳述式替代。
MERGE,語法統一、效能最優、可同時處理 INSERT/UPDATE/DELETE。理解語法差異只是起點,根據業務場景選擇合適工具、編寫可維護的 SQL 才是核心競爭力。