【问题标题】:SQL Delete on inner join on MISSING data对缺失数据进行内部连接时的 SQL 删除
【发布时间】:2014-05-01 21:25:54
【问题描述】:

我的问题与SQL DELETE with INNER JOIN 几乎相同;但我想在不相等时删除!

我的问题简介: 有2个表,bus_stops,bus_routes;

bus_routes {id, bus_route_id,..other columns..}
bus_stops {id, bus_route_id,..other columns..}

部分路线已被删除,但仍有公交车站,我也需要删除它们。意思是,我只需要删除没有关联公交路线的 bus_stops!

意思是这样的:

DELETE bs.* FROM bus_stops AS bs 
INNER JOIN bus_routes AS br 
ON bs.bus_route_id <> br.bus_route_id

但是上面的代码肯定不行。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    你应该使用LEFT JOIN,下面的查询会起作用:

    DELETE bs.*  
    FROM bus_stops AS bs 
    LEFT JOIN bus_routes AS br 
    ON bs.bus_route_id = br.bus_route_id
    WHERE br.bus_route_id IS NULL
    

    【讨论】:

    • 谢谢,Eduardo :) 解决方案非常简单,我错过了 :)
    【解决方案2】:

    SQL 中的连接首先是两个表的笛卡尔积。这意味着表 A 的每条记录都与表 B 的每条记录相结合。然后,连接条件通过删除与条件不匹配的记录来减少记录。

    如果您使用不等于 () 的 INNER JOIN,如果您至少有不同的值,则每条记录都将被删除。一个小例子:

    Table A | B     Table C | D
    =============   =============
            | 1             | 1
            | 2             | 2
    

    A X B 的笛卡尔积是:

      | B | D
    ==========
      | 1 | 1
      | 1 | 2
      | 2 | 1
      | 2 | 2
    

    如果您现在使用 B C 来选择值,结果将是:

      | B | D
    ==========
      | 1 | 2
      | 2 | 1
    

    这将删除两条记录。

    作为一种解决方案,尝试外部连接或子查询。

    示例(子查询):

    DELETE FROM C WHERE NOT EXISTS(SELECT * FROM A WHERE A.B = C.d)
    

    示例(外部连接):

    DELETE FROM C LEFT JOIN A ON C.D = A.B WHERE A.B IS NULL
    

    【讨论】:

    • 需要在LEFT JOIN后面加上ON子句
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2015-09-08
    • 2014-02-22
    相关资源
    最近更新 更多