/ / SQL Odstrániť na vnútornom pripojení na MISSING dáta - mysql, sql

SQL Vymazať na vnútornom spojenie na MISSING dáta - mysql, sql

Moja otázka je takmer identická SQL DELETE s INNER JOIN ; ale chcem odstrániť na nerovnomernom!

MOJE PROBLÉM V BRIEF: K dispozícii sú 2 stoly, bus_stops, bus_routes;

bus_routes {id, bus_route_id,..other columns..}
bus_stops {id, bus_route_id,..other columns..}

Niektoré trasy boli odstránené, ale zostávajú autobusové zastávky, musím ich tiež odstrániť. Znamená to, že musím odstrániť len bus_stops, ktoré nemajú žiadnu asociovanú trasu autobusu!

To znamená niečo ako:

DELETE bs.* FROM bus_stops AS bs
INNER JOIN bus_routes AS br
ON bs.bus_route_id <> br.bus_route_id

Ale vyššie uvedený kód určite nebude fungovať.

odpovede:

3 pre odpoveď č. 1

Mali by ste používať LEFT JOINPod otázka bude fungovať:

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 pre odpoveď č. 2

Prístup k SQL je predovšetkým kartézskyprodukt oboch tabuliek. Znamená to, že každý záznam tabuľky A je kombinovaný s každým záznamom v tabuľke B. Podmienka pripojenia potom znižuje záznamy tým, že vylučuje záznamy, ktoré nezodpovedajú danému stavu.

Ak použijete INNER JOIN s nerovnakým (<>), každý záznam bude vymazaný, ak máte aspoň odlišné hodnoty. Malý príklad:

Table A | B     Table C | D
=============   =============
| 1             | 1
| 2             | 2

Karteziánsky produkt A X B je:

  | B | D
==========
| 1 | 1
| 1 | 2
| 2 | 1
| 2 | 2

Ak teraz používate B <> C na výber hodnôt, výsledok bude:

  | B | D
==========
| 1 | 2
| 2 | 1

Týmto sa odstránia obe záznamy.

Ako riešenie skúste vonkajší spoj alebo poddotaz.

Príklad (poddotaz):

DELETE FROM C WHERE NOT EXISTS(SELECT * FROM A WHERE A.B = C.d)

Príklad (vonkajší spoj):

DELETE FROM C LEFT JOIN A ON C.D = A.B WHERE A.B IS NULL