@大吉 已于 2023-01-17 15:47:38 修改 4337 收藏 6 分類專欄: 數(shù)據(jù)庫 文章標簽: mysql 數(shù)據(jù)庫 sql update TEMPORARY 版權 數(shù)據(jù)庫 專欄收錄該內(nèi)容 13 篇文章0 訂閱 訂閱專欄 場景 寫一個update語句,,需要關聯(lián)多個表。關聯(lián)一個表還好,,但是你要關聯(lián)四五個表: update aTable a inner join bTable b on a.id = b.id inner join cTable c on b.define1 = c.subcode inner join dTable d on d.id = c.subcode set a.Demand_orgid = c.req_org_id where xxx = xxx; 上面這個SQL,,在一個update里面連接了3個inner join。那么你會發(fā)現(xiàn)執(zhí)行速度慢的出奇,。 如果你使用left join,,那么會更卡幾倍,。這點有待考證,所以能用inner join連就用inner join 連吧,。 解決方案 MySQL為我們提供了一種臨時表,,可以應用于這種復雜數(shù)據(jù)更新的場景: 在MySQL中,臨時表是一種特殊類型的表,,它允許您存儲一個臨時結果集,,可以在單個會話中多次重用。 當使用JOIN子句查詢需要單個SELECT語句的數(shù)據(jù)是不可能或遇到瓶頸的時候,,臨時表非常方便,。 在這種情況下,我們就可以使用臨時表來存儲直接結果,,并使用另一個查詢來處理它,。 參考資料:https://www./mysql/temporary-table.html MYSQL臨時表只能出現(xiàn)在【數(shù)據(jù)庫連接的單個會話中】。也就是說你重啟Navicat,,臨時表緩存就消失 那么解決方案就出來了,,你可以先使用select語句,將你所有需要關聯(lián)的條件整合成一張臨時表: -- 創(chuàng)建臨時表 CREATE TEMPORARY TABLE tempTable0( select a.resid,b.define1,c.reqid,a.id from tableA a inner join tableB b on a.id = b.id inner join tableC c on c.id = b.id where c.id <> '10086' ); -- 查看你的臨時表: select * from tempTable0; 然后你就有了一張可以隨便玩的臨時表,。 最后寫更新語句的時候,,只需要寫一個inner join,連接這個臨時表,,就可以實現(xiàn)復雜數(shù)據(jù)更新了: update tableA a inner join tempTable0 b on a.id = b.id set a.Demand_orgid = b.req_org_id; 1 2 3 補充:臨時表選擇數(shù)據(jù)庫,、刪除臨時表 臨時表是根據(jù)當前鏈接選擇的數(shù)據(jù)庫創(chuàng)建的 -- 選擇數(shù)據(jù)庫 use db1; -- 創(chuàng)建臨時表 CREATE TEMPORARY TABLE tempTable0 ( select publishtime from table0 as a left join db3.bs as b on b.pu_billcode = a.upcode); -- 選擇臨時表 select * from db1.tempTable0; -- 刪除臨時表 DROP TEMPORARY TABLE IF EXISTS db1.tempTable0; 文章知識點與官方知識檔案匹配,可進一步學習相關知識 ———————————————— 版權聲明:本文為CSDN博主「@大吉」的原創(chuàng)文章,,遵循CC 4.0 BY-SA版權協(xié)議,,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/weixin_44757863/article/details/126332126 |
|
來自: hncdman > 《數(shù)據(jù)庫》