[英]SQL Delete on inner join on MISSING data
我的問題與使用INNER JOIN的SQL DELETE幾乎完全相同; 但我想刪除不等於!
我的問題簡介:有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
但是上面的代碼肯定不會起作用。
您應該使用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
SQL中的聯接首先是兩個表的笛卡爾積。 這意味着表A的每個記錄都與表B的每個記錄組合在一起。然后,連接條件通過消除不符合條件的記錄來減少記錄。
如果您使用不等於(<>)的INNER JOIN,則如果至少具有不同的值,則將刪除每條記錄。 一個小例子:
Table A | B Table C | D
============= =============
| 1 | 1
| 2 | 2
AXB的笛卡爾積為:
| 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.