搜索

首页  >  问答  >  正文

重写后的标题为:适用于数据清理的MySQL查询语句

<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粉413704245P粉413704245456 天前572

全部回复(1)我来回复

  • P粉546179835

    P粉5461798352023-09-04 14:09:32

    这个查询应该可以工作:

    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

    回复
    0
  • 取消回复