工作中遇到需要將一個表中的數據按照對應規則填入別的表中的情況
例如
表1 a
a1 a2
11 90889
32 31241
12 52123
表2 b
b1 b2
11
12
13
其中a1與b1是同一個字段(比如存的都是姓名)
a2與b2是同一字段
需求:現在需要通過a1,b1將a2導入到b2中
條件:a1,b1一一對應,且每一條a1都有對應b1與之對應
例句子查詢方式
update
balancesheet b
set
b.cs=
(
select stockCode from company c
where c.id=b.comid
)
explain
5w條數據用時0.7s
聯合查詢方式
update
balancesheet b
inner join
company c
using(stockCode)
set
b.cs=c.stockCode
explain
用時0.8s
由於更新的目標表只有一個,優化器沒有辦法改變關聯的順序。在有合適的索引的情況下,子查詢的效率反而高於關聯查詢!跟我們的刻板印象不同!
條件:a1,b1一一對應,並不是每一條a1都有對應b1與之對應
例句子查詢方式
update
balancesheet b
set
b.cs=
(
select stockCode from company c
where c.id=b.comid
)
經過漫長的等待之后,
提示子查詢返回超過一條結果??
[Err] 1242 - Subquery returns more than 1 row
可以推算到原因應該是不是每一條a1都能找到b1,優化器的執行路徑發生了變化!
這時只能寄希望於聯合查詢
聯合查詢方式
update
balancesheet b
inner join
company c
using(stockCode)
set
b.cs=c.stockCode
結果是可以順利執行!!ok!!
這里我們可以看到不同索引,不同的數據對應條件對sql的執行路徑產生了無法預估的影響。
刻板影響也不一定是正確的!
對於sql語句的效率一般來說還是需要經過測試才能的出想要的解。
而對於問題而言,聯合查詢的方式是更加通用的!!子查詢的方式邏輯容易理解,部分可以使用的情況下有更好的效率。