重寫後的標題為:適用於資料清理的MySQL查詢語句
P粉413704245
P粉413704245 2023-09-03 18:23:21
0
1
556
<p>我有三個表。一個表是旅行距離表</p> <pre class="brush:php;toolbar:false;">create table routes ( slat int, slng int, dlat int, dlng int, distance int );</pre> <p>一個表格是站點表</p> <pre class="brush:php;toolbar:false;">create table sites ( id int, name varchar(100), lat int, lng int );</pre> <p>還有一個表格是技術人員表</p> <pre class="brush:php;toolbar:false;">create table fse ( id int, name varchar(100), lat int, lng int );</pre> <p>旅行距離表是透過Google API請求動態填充的。因此,如果有新的網站或新的技術人員,所有新的旅行距離都會透過Google請求並儲存到路線表中。 </p> <p>當然,也可能發生客戶或技術人員離開的情況。在這種情況下,即使不再使用,距離表中的條目仍然保留在資料庫中。 </p> <p>我想要刪除表中這些未使用的行。因此,我正在尋找一種查詢方式,可以刪除網站/技術人員表中所有「不存在」的緯度/經度組合,就像在此fiddle的評論中所寫的那樣</p> <p>https://www.db-fiddle.com/f/mwF1iyZ7nn8rnDcE8Wstch/0</p> <p>我可以自己編寫此查詢,但我唯一的解決方案是使用非常多的子查詢。但我想知道是否有更有效率的方法,希望這裡的SQL專家能幫忙? </p>
P粉413704245
P粉413704245

全部回覆(1)
P粉546179835

這個查詢應該可以工作:

delete from routes where concat (slat,'|', slng) not in (
  select concat(lat ,'|', lng) from sites 
  union  select concat(lat,'|',lng) from fse
) ;

它從表格sitesfse中選取所有記錄,並刪除在子查詢中找不到記錄的routes表中的行。需要使用兩列的concat,因為in只能處理一列。 |只是用來分隔值的。

DB-Fiddle

##
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!