我的问题几乎与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
但上述代码肯定不会起作用。
答案 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