簡體   English   中英

對MISSING數據進行內部聯接的SQL刪除

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM