隨便貼一張網友的妙文: 性能
今天有這樣一個需求:由於要加快查詢速度,避免表的聯合查詢的效率問題,因此要把一個表的幾個字段填到另外一個表的幾個字段上去。
一開始作法以下:
update tbl1 a, tbl2 b set a.col1=b.col1,a.col2=b.col2 where a.key=b.key
這個語句在 MySQL 上是能夠運行的,但在 ORACLE 上沒法執行。在網上查了一個發現能夠這樣:
update tbl1 a
set a.col1=(select b.col1 from tbl2 b where a.key=b.key),
a.col2=(select b.col2 from tbl2 b where a.key=b.key)
但我感受這樣的效率好像比較低,寫得SQL又很長,更新一行數據要寫兩個嵌套,直觀上感受 "select xxx from tbl2 b where a.key=b.key" 語句好像被執行了兩遍(實際我沒有測試驗證)。因而接着在網上搜,查到一個比較好看的寫法,以下: 測試
update tbl1 a
set (a.col1, a.col2) = (select b.col1, b.col2
from tbl2 b
where a.key = b.key)
字體
這種寫法感受還比較滿意。但注意了,通過測試,這種語法在 MySQL 中是不合法的。 spa
今天繼續使用最後這個SQL的時候,也發現了一些缺點:若是 tbl1.key 的值在 tbl2.key 中沒有此值是,這個更新的兩個字段 tbl1.col1 和 tbl1.col2 字段會被更新爲空值(null)。這個結果是我不想看到的。也是沒辦法解決的。若是想解決的話,也能夠在最後加入一個條件,以下表中加大字體的部分: 效率
update tbl1 a
set (a.col1, a.col2) = (select b.col1, b.col2
from tbl2 b
where a.key = b.key)
where a.key in(select key from tbl2)
date
但這種作法確定會致使性能嚴重降低。因此,我寫一個更復雜的方法來解決這個問題,如今沒時間。。。 select