跨庫開發時,DELETE 与 UPDATE 对表别名的处理是常见坑点。Oracle 允许在 DELETE FROM 后直接跟别名,而 SQL Server 必须在 DELETE 后指定目标表名,再在 FROM 子句中使用别名。
DELETE 語法對照表
| 場景 | Oracle | SQL Server | 通用寫法(推薦) |
| 帶別名刪除 | DELETE FROM TableA a WHERE a.col = 1 | DELETE TableA FROM TableA a WHERE a.col = 1 | DELETE FROM TableA WHERE TableA.col = 1 |
| 子查詢關聯刪除 | DELETE FROM A a WHERE a.id IN (SELECT id FROM B) | DELETE A FROM A a WHERE a.id IN (SELECT id FROM B) | 同上 |
UPDATE 語法對照表
| 場景 | Oracle | SQL Server | 通用寫法 |
| 帶別名更新 | UPDATE TableA a SET a.col = 1 WHERE a.id = 1 | UPDATE a SET a.col = 1 FROM TableA a WHERE a.id = 1 | UPDATE TableA SET col = 1 WHERE id = 1 |
核心規則速記
- SQL Server DELETE:
DELETE 目標表 FROM 目標表 別名 ...
- SQL Server UPDATE:
UPDATE 別名 SET ... FROM 目標表 別名 ...
- Oracle:
DELETE/UPDATE 別名 ... 直接跟別名。
最佳實踐建議
- 編寫跨庫通用代碼時,盡量不使用別名,直接用表名全寫。
- 若必須用別名(如多表關聯),請在 DAL 層按目標數據庫生成差異化 SQL。
- 單元測試務必在目標數據庫實例上跑通,不要只在 Oracle 驗證就假設 SQL Server 也能跑。
錯誤案例回顧
-- SQL Server 報錯:Incorrect syntax near 'a'
DELETE FROM TableA a WHERE a.col = 1;
-- 正確
DELETE TableA FROM TableA a WHERE a.col = 1;
-- UPDATE 錯誤
UPDATE TableA a SET a.col = 1 WHERE a.id = 1;
-- 正確
UPDATE a SET a.col = 1 FROM TableA a WHERE a.id = 1;