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ď č. 1Mali by ste používať LEFT JOIN
Pod 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