2012-07-16

將查詢結果(select)寫到(update)資料表

需求是「代碼轉換」,要將 table 裡的「舊代碼」參照「代碼對照表」轉換成「新代碼」,舉例說明,要將舊代碼「A01」轉換成新代碼「A001」,而「A01」對照「A001」的訊息都寫在代碼對照表裡;或者要將 A table 裡的代碼寫到 B table 裡,A 與 B 之間有 Foreign Key。


之前是在 SQL Server 遇到這個需求,解法有點不符合 SQL 的概念。
-- 代碼轉換
update A set code = (
 select b.newCode from B b where b.oldCode = A.code
);
-- 將 B 的代碼寫到 A
update A set code = (
 select b.code from B b where b.id = A.bid 
);
SQL Server 是用 Subquery,但是在 Subquery 裡是用 outer table name,也就是 A,不是 outer table alias,這是相當反直覺的用法。

而 MySQL 則是用 select 多個 table 的概念。
-- 代碼轉換
update A a, B b set a.code = b.newCode where b.oldCode = a.code;
-- 將 B 的代碼寫到 A
update A a, B b set a.code = b.code where b.id = a.bid;
---

沒有留言:

張貼留言