Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: uzupełnienie brakujących kodów pocztowych
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
mkarach
Witam,

Potrzebuje pomocy. mam tabelę o nazwie adres w której mam dane teleadresowe klientów( kolumny: imie, nazwisko, miejscowosc,ulica, rokurodzenia, kodpocztowy)
Mam dla Gdańska przypisane różne kody pocztowe dla klientów wg ulic wg danych z poczty polskiej.
Problem w tym ze jeden rokurodzenia='1978' nie ma przypisanych kodów pocztowych.

Chciałbym przypisać rocznikowi 1978 kodpocztowe z pozostałych roczników ale z dopasowaniem do ulic.

Rekordy obecnie wygladają tak:
Jan Nowak, Gdańsk, Grunwaldzka ,1967,80-170
Janina Nowak, Gdańsk, Grunwaldzka,1978, 00-00
Sylwia Kowalska, Gdańsk, Ślepa ,1947,80-169
Karola Nowaczyk, Gdańsk, Ślepa,1978, 00-00

a powinny tak:
Jan Nowak, Gdańsk, Grunwaldzka ,1967,80-170
Janina Nowak, Gdańsk, Grunwaldzka,1978, 80-170
Sylwia Kowalska, Gdańsk, Ślepa ,1947,80-169
Karola Nowaczyk, Gdańsk, Ślepa,1978, 80-169

Ręcznie ciężko to zrobić ,bo to ponad 3 tyś rekordów.
jakiej funkcji uzyć, bo warunek sqla pewnie będzie taki?:

where miejscowosc='Gdańsk' and kodpocztowy='00-000' and rokurodzenia='1978'

z góry dzięki za pomoc.

erix
A ciężko przetestować...?
thek
Nie testowałem w Postgresie, ale MySQL pozwala w UPDATE JOINować do tabeli modyfikowanej, ale jeśli to ta sama to chyba i tak by zablokowało z tego co kojarzę... Tutaj musiałbyś przy SET kodpocztowy ustawić kodpocztowy wybierany SELECTem zgodnym z ulicą i miastem rekordu zmienianego, ale różnym kodem od 00-000 i stąd własnie wygodne byłoby złączenie JOINem obu: zmienianej i przeszukiwanej. Niestety nie używałem Postgressa więc nie wiem czy on takie złączenie wspiera a jeśli tak, to czy zezwalana taki UPDATE :/
mkarach
kombinowałem update set, insert into, nawet poprzez copy do tabeli tempowej ale nic nie pomogło.
Nie mam zielonego pojęcia.
mortus
Zwykły UPDATE + SELECT:
  1. UPDATE adres
  2. SET kodpocztowy = (
  3. SELECT kodpocztowy
  4. FROM adres a1
  5. WHERE a1.miejscowosc = adres.miejscowosc AND a1.ulica = adres.ulica AND a1.rokurodzenia <> 1978 AND kodpocztowy <> '00-000'
  6. LIMIT 1
  7. )
  8. WHERE adres.kodpocztowy = '00-000'

Tylko nie jestem pewien, czy te puste wartości kodu pocztowego, to u Ciebie 00-000, czy 00-00.
Oczywiście to przy założeniu, że w Gdańsku nie ma dwóch ulic o takiej samej nazwie (bo z tym się spotkałem).
mkarach
Cytat(mortus @ 30.12.2011, 14:41:55 ) *
Zwykły UPDATE + SELECT:
  1. UPDATE adres
  2. SET kodpocztowy = (
  3. SELECT kodpocztowy
  4. FROM adres a1
  5. WHERE a1.miejscowosc = adres.miejscowosc AND a1.ulica = adres.ulica AND a1.rokurodzenia <> 1978 AND kodpocztowy <> '00-000'
  6. LIMIT 1
  7. )
  8. WHERE adres.kodpocztowy = '00-000'

Tylko nie jestem pewien, czy te puste wartości kodu pocztowego, to u Ciebie 00-000, czy 00-00.
Oczywiście to przy założeniu, że w Gdańsku nie ma dwóch ulic o takiej samej nazwie (bo z tym się spotkałem).


Wygląda to całkiem nieźle.
Zabraklo "as" w from adres a1
i w warunku WHERE adres.kodpocztowy = '00-000' powinno byc jeszcze adres.miejscowosc='Gdańsk'

Gdy uruchamiam to query to dostaje komunikat z błędem :
BŁĄD: pusta wartość w kolumnie "kodpocztowy" narusza ograniczenie wymaganej wartości
mortus
AS nie jest wymagane (a1 automatycznie staje się aliasem), warunku w klauzuli WHERE rzeczywiście zabrakło.

Komunikat błędu sugeruje, że któraś z ulic w ogóle nie ma nadanego właściwego kodu pocztowego. Pobieramy zatem wartość NULL, której użyć nie możemy ze względu na ograniczenia wprowadzone na kolumnę kodpocztowy. Sprawdź to.
mkarach
Cytat(mortus @ 1.01.2012, 23:48:32 ) *
AS nie jest wymagane (a1 automatycznie staje się aliasem), warunku w klauzuli WHERE rzeczywiście zabrakło.

Komunikat błędu sugeruje, że któraś z ulic w ogóle nie ma nadanego właściwego kodu pocztowego. Pobieramy zatem wartość NULL, której użyć nie możemy ze względu na ograniczenia wprowadzone na kolumnę kodpocztowy. Sprawdź to.


Bingo. W PGAdminei wyłaczyłem opcje dla kolumny kodpocztowy NIE NULL i zadzialało. Okazało się ze przy 3 ulicach na 3 tysiące rekordów nie mógł dopasować gdyż w nazwie ulicy Gen. Hallera nie było kropki po Gen.

dzięki za pomoc.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.