Fent említett feladatot próbálom megoldani, de olyan megoldás kéne ami a leggyorsabb(pl. belső select nélkül) mert a táblában több millió rekord van.
Az én megoldásom:
DELETE FROM placex WHERE place_id not in (SELECT min(place_id) FROM placex GROUP BY osm_id,osm_type);
Hogy lehetne ezt belső select nélkül megoldani? :)
válaszokat előre is köszi!
- 1309 megtekintés
Hozzászólások
Milyen adatbázis kezelő?
-----------
"Pontban 0:00-kor nem nagyon szoktak véletlen dolgok történni"
- A hozzászóláshoz be kell jelentkezni
postgre
- A hozzászóláshoz be kell jelentkezni
delete
from table t1
using table t2
where t1.columnA = t2.columnA
and t1.rowid > t2.rowid
Innen másoltam (így felelőséget se vállalok) :P
- A hozzászóláshoz be kell jelentkezni
ez nem jó. :)
- A hozzászóláshoz be kell jelentkezni
Én ezt úgy csinálnám meg, hogy csinálnék egy temp táblát, ahová beszúrnám a SELECT min(place_id) FROM placex GROUP BY osm_id,osm_type eredményét, majd inner join az eredeti táblával és az összes rekordot beszúrnám egy újabb táblába, csak előtte a temp tábla egyetlen mezőjét megtenném elsődleges kulcsnak. Majd két átnevezéssel megcserélném a két táblát.
-----------
"Pontban 0:00-kor nem nagyon szoktak véletlen dolgok történni"
- A hozzászóláshoz be kell jelentkezni
"SELECT min(place_id) FROM placex GROUP BY osm_id,osm_type eredményét"
így csak a place_id-kat szűri ki, mikor az összes oszloppal kéne.
- A hozzászóláshoz be kell jelentkezni
"SELECT min(place_id) FROM placex GROUP BY osm_id,osm_type eredményét"
így csak a place_id-kat szűri ki, mikor az összes oszloppal kéne.
- A hozzászóláshoz be kell jelentkezni
Sorry, gyorsban írtam a hsz-t, a min place_id mellé tedd le az elsődleges kulcsot és az alapján kapcsold az eredeti táblához.
-----------
"Pontban 0:00-kor nem nagyon szoktak véletlen dolgok történni"
- A hozzászóláshoz be kell jelentkezni
SELECT
után írt
DISTINCT
kitétel az azonos sorok közül nem csak egyet hagy meg az eredményhalmazban?
Ezt nem lehetne valahogy felhasználni?
G.
============================================
"Share what you know. Learn what you don't."
- A hozzászóláshoz be kell jelentkezni
A place_id miatt nem tudsz DISTINCT-et használni.
szerk.: Akkor a többi miatt sem :)
-----------
"Pontban 0:00-kor nem nagyon szoktak véletlen dolgok történni"
- A hozzászóláshoz be kell jelentkezni
"create temp table temp_test as select distinct * from placex;"
csináltam egy ilyen szűrést, de ugyanúgy belerakta többször a sorokat, mivel csak két oszlop (osm_id, osm_type) mezők egyeznek meg a többi nem. :D
Nominatim is full of fun..
- A hozzászóláshoz be kell jelentkezni
Na tempbe kiszűrtem a duplikátumokat és úgy töröltem a túróba az egészet.. :)
viszont van ilyen lekérdezés ami az egynél több rekordot és még gyors is:
DELETE FROM placex WHERE place_id IN (SELECT place_id FROM (SELECT place_id, ROW_NUMBER() OVER (PARTITION BY osm_id, osm_type ORDER BY place_id) AS rnum FROM placex) t WHERE t.rnum>1);
- A hozzászóláshoz be kell jelentkezni