私の質問は 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