將編輯好的 SQL 查詢複製到 SSMS 會出現無法執行錯誤

用指定資料表欄位內容更新到另外一張資料表

本文章將描述透過兩種不同的 Transact-SQL 語法將資料表欄位更新到另外資料一張資料表的欄位

文章環境
資料庫
Microsoft SQL Server 2017
情境說明

範例為模擬有價證券交易資料庫建立之部分資料表內容,建立資料表說明如下

Stocks.StockDailyTradings 有價證券每日交易結果統計
Stocks.StockMains 有價證券主資料表
Trades.TradePerFiveSeconds 每五秒交易結果

資料表內容如下

要從 Trades.TradePerFiveSeconds 資料表中取得指定日期每檔有價證券的交易結果統計:最高價、最低價、成交量並更新至 Stocks.StockDailyTradings 資料表

範例 Transact-SQL 指令碼可以在此 Github 路徑中取得
txstudio/update-column-by-join-two-tables

使用 CURSOR 進行更新

請參考下列 Transact-SQL 指令碼
update-column-use-cursor.sql

將 Trades.TradePerFiveSeconds 資料表統計好指定日期各有價證券交易資訊透過指標 (CURSOR) 的方式更新到 Stocks.StockDailyTradings 資料表,並使用交易 (Transaction) 將指令包起來

請注意!此方法在更新語法的撰寫上很明確,但為不正確的解法,指標 (CURSOR) 的特性為走單一核心處理。若還使用交易的話,資料量大時此方法將會造成資料表鎖定時間過久

使用 UPDATE JOIN 進行更新

請參考下列 Transact-SQL 指令碼
update-column-use-update-join.sql

將 Trades.TradePerFiveSeconds 資料表統計好指定日期各有價證券交易資訊透過 UPDATE JOIN 方式更新到 Stocks.StockDailyTradings 資料表

此方法雖然不太好賺寫,但可避免使用指標 (CURSOR) 會只使用到單一處理器核心的問題

UPDATE JOIN 的語法在 Oracle/SQL Server 是不同的 (MySQL 沒有執行過)
結論

在此情境中,使用指標 (CURSOR) 也是可以完成要的答案,但使用 UPDATE JOIN 語法是夠更有效率的作法

參考資料

留言