Why Mysql Why?

Tegnap egyik kolléga panaszkodott, hogy van egy kisebb issue az egyik régi legacy rendszerünkkel és picit meg kellene patkolni. Sebaj, essünk neki.

Lett is egy query, ami megmondta, hogy mit kellene kipucolni a DB-ből bizonyos esetek fennállása esetén, ami nagyjából így nézett ki:

SELECT id FROM Tabla LEFT JOIN masik tabla ON tralala WHERE blablabla

De hívjuk csak így, hogy

SELECT id FROM Tabla WHERE blabla

, mert a példához elegendő.

Mivel nem sok adatról van szó, elvileg nem lehet abból gond, ha ezt az ember berakja egy sima DELETE querybe, mondjuk így:

DELETE FROM Tabla 
WHERE id IN (
  SELECT id FROM Tabla WHERE blabla
)

Működik? Persze, hogy nem. De van workaround!

DELETE FROM Tabla 
WHERE id IN (
  SELECT id FROM (SELECT * FROM Tabla) WHERE blabla
)

Gondolom nem kell részleteznem a sebességét, hiába gyors maga a query.

Szerencsére van egy fél fokkal kulturáltabb megoldás, már ha valaki végigolvassa az apró betűst is a doksiban:

DELETE Tabla
FROM Tabla
  LEFT JOIN MasikTabla ON ...
WHERE blablabla

És akkor most vessünk egy pillantást a PostgreSQL doksijára, ahol az, hogy ezt hogy kell megoldani, már a legelején az összegzésből kiderül, hogy hogyan kivitelezhető és még csak véletlen sem kell ilyen subquerys bohóckodás, ha csak simán lustaságból valaki be akar emelni egy már jól megírt, tesztelt queryt egy DELETE-hez.

Hozzászólások

Nem eleg lecserelni a SELECT-et DELETE-re? JOIN ugyanugy mukodik.

Nekem nem tűnik ez a doksiban apró betűsnek, még görgetni sem kell hozzá, a 3. alcím.

En sem erzem ezt fajdalmas dolognak, minap kellett ilyesmi, gyors google kereses megmondta a megoldast, amit te is megtalaltal vegul

off

van valami elvi oka annak, hogy a

SELECT id FROM (SELECT * FROM Tabla) WHERE blabla

kifejezést nem optimalizálja ki a bármi

SELECT id FROM Tabla WHERE blabla

kifejezéssé?
köszi!

/off
--
blogom

Mondjuk egyik oka lehet az volt, hogy az régi MySQL volt. De bevallom őszintén nem néztem explaint. Lehet, hogy az újabbak valamivel értelmesebbek, de régen a MySQL elég csehül állt a subquerykkel.

PostgreSQL kioptimalizálja. MSSQL-ről feltételezem, hogy kioptimalizálja (nem próbáltam ki), másról nem tudok nyilatkozni munkám során 99%, hogy Pg-vel vagy MSSQL-el dolgozok.

----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™