在MISSING数据上的内连接上删除SQL

时间:2014-03-24 13:28:28

标签: mysql sql

我的问题几乎与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

但上述代码肯定不会起作用。

2 个答案:

答案 0 :(得分:3)

您应该使用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

答案 1 :(得分:2)

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

如果您使用不相等的INNER JOIN(&lt;&gt;),那么如果您至少拥有不同的值,则会删除所有记录。一个小例子:

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

A X B的笛卡尔积是:

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

如果您现在使用B&lt;&gt; 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