/ / MISSINGデータの内部結合のSQL削除 - mysql、sql

MISSINGデータの内部結合のSQL削除 - mysql、sql

私の質問は INNER JOINを使用したSQLの削除 ;私は非等価で削除したい!

簡単な私の問題: bus_stops、bus_routesという2つのテーブルがあります。

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

しかし、上記のコードは間違いなく動作しません。

回答:

回答№1の場合は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

回答№2については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