Temat: Porządki na podstawie tablicy 'słownikowej' - problem nowicjusza...
Panowie, ja znowu z prośbą, bo jestem zwyczajnie za cienki, aby zrobić to, co chciałbym zrobić...
Jednocześnie mam świadomość, że cała rzecz jest zapewne prosta (może nawet banalnie), a mnie blokuje przyzwyczajenie do sekwencyjnego przetwarzania danych (Clipper, FoxPro, Progress).
Mam dwie tablice ULICE i ADRESY.
ULICE to słownik, który podpowiada ulicę do adresu po kodzie pocztowym. Bałagan był tam straszny (literówki, różna pisownia, nadmiarowe spacje itp. kwiatki). Z tym zrobiłem porządek, ale efekt jest teraz taki, że ta sama nazwa ulicy powiela się dla tego samego kodu pocztowego.
Oczywiście cały ten bałagan pozostał w powiązanej tablicy ADRESY - nie jest to sprawa krytyczna, bo dopóki użytkownik nie będzie próbował modyfikować danych, to w ADRESY pozostaje poprzednia wartość. Próba modyfikacji pociąga za sobą wyświetlenie listy do kilkunastu identycznych pozycji - trochę głupawo to wygląda...
Poniżej framenty obu tablic - pewnie już na pierwszy rzut oka będzie widać co jest grane.
ULICE (po przeprowadzonych porządkach)
Ulica character varying(65) NOT NULL; kod_poczty character varying(6); id_ulicy_poczty integer NOT NULL
"3 MAJA";"87-600";1635
"3 MAJA";"87-500";1632
"3 MAJA";"83-300";1478
"3 MAJA";"82-500";1008
"3 MAJA";"82-500";701
"3 MAJA";"82-500";704
"3 MAJA";"82-500";703
"3 MAJA";"82-500";699
"3 MAJA";"82-500";705
"3 MAJA";"82-500";700
"3 MAJA";"82-500";702
"3 MAJA";"82-500";698
Są dwa indeksy: na kolumny kod_poczty+ulica i na kolumnę ulica.
Nie można usunąć rekordu, którego id_ulicy_poczty wykorzystany jest w ADRESY.
ADRESY (DLA PRZYKŁADOWEJ NAZWY ULICY '3 MAJA', OCZYWIŚCIE KOLUMN JEST WIĘCEJ, ALE SĄ NIEISTOTNE DLA ROZWIĄZANIA...)
id_ulicy_poczty integer NOT NULL; kod_poczty character varying(6); Ulica character varying(65) NOT NULL;
698;"82-500";"3 MAJA"
698;"82-500";"3 MAJA"
698;"82-500";"3 MAJA"
699;"82-500";"3 -GO MAJA"
700;"82-500";"3 Maja"
700;"82-500";"3 Maja"
700;"82-500";"3 MAJA"
700;"82-500";"3 MAJA"
700;"82-500";"3 MAJA"
700;"82-500";"3 MAJA"
700;"82-500";"3 MAJA"
701;"82-500";"3 MAJA 24/10"
702;"82-500";"3 Maja, galeria"
703;"82-500";"3- Go Maja"
703;"82-500";"3- Go Maja"
704;"82-500";"3-ego MAJA"
704;"82-500";"3-EGO MAJA"
704;"82-500";"3-EGO MAJA"
705;"82-500";"3-go Maja"
705;"82-500";"3-GO MAJA"
705;"82-500";"3-GO MAJA"
705;"82-500";"3-GO MAJA"
1008;"82-500";"3-GO MAJA"
1478;"83-300";"3 MAJA"
1632;"87-500";"3 MAJA"
1635;"87-600";"3-go Maja"
1635;"87-600";"3-go Maja"
1635;"87-600";"3-go Maja"
Jak widać w tablicy ADRESY powielają się rekordy, przy czym zawartość pola 'Ulica' jest pochodną pierwotnie istniejącej wartości w słowniku (czyli w tablicy ULICE).
Chciałbym:
- w tablicy ADRESY kolumn 'Ulica' i 'id_ulicy_poczty' wypełnić pierwszą pasującą do kolumny 'Kod_poczty' wartością kolumn 'Ulica' i 'id_ulicy_poczty' pobraną z tablicy ULICE
- usunąć z tablicy ULICE dublujące się, nieużywane rekordy o identycznej wartości Ulica+Kod_poczty
Czyli doprowadzić do takiej postaci:
FINALNE ULICE:
"3 MAJA";"87-600";1635
"3 MAJA";"87-500";1632
"3 MAJA";"83-300";1478
"3 MAJA";"82-500";1008
FINALNE ADRESY:
1008;"82-500";"3 MAJA"
1008;"82-500";"3 MAJA"
(...)
1008;"82-500";"3 MAJA"
1008;"82-500";"3 MAJA"
1478;"83-300";"3 MAJA"
1632;"87-500";"3 MAJA"
1635;"87-600";"3 MAJA"
1635;"87-600";"3 MAJA"
1635;"87-600";"3 MAJA"
Sekwencyjnie zrobiłbym to tak:
- najpierw indeks na ULICE.id_ulicy_poczty
- potem sekwencyjnie dla każdego rekordu w ADRES szukam w ULICE po id_ulicy_poczty nazwy ulicy i zamieniam
- potem indeks unikalny na ULICE.Ulica+ULICA.kod_poczty
- potem sekwencyjnie dla każdego rekordu w ADRES szukam w ULICE po ADRES.Ulica+ADRES.kod_poczty wartości id_ulicy_poczty i zamieniam
- wreszcie usuwam z ULICE wszystkie rekordy nie mające relacji ULICE.id_ulicy_poczty=ADRES.id_ulicy_poczty
Jak się do tego zabrać na postgresie nie mam bladego pojęcia
Do dyspozycji mam pgAdminIII...
Wiem, że wygląda na to, że proszę prawie o gotowca, ale operacje na więcej niż jednej tablicy - i to tak 'skomplikowane' - naprawdę w tym stanie mojej wiedzy przekraczają możliwości...
Jeśli nie będę mógł liczyć na kawałek przykładowego kodu, to może jakaś dobra dusza wskaże konkretne miejsce, gdzie mógłbym zapoznać się ze zbliżonym przykładem?
Pozdrawiam
Grzechu