mkarach
30.12.2011, 10:38:36
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
30.12.2011, 11:22:02
A ciężko przetestować...?
thek
30.12.2011, 11:33:33
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
30.12.2011, 12:46:36
kombinowałem update set, insert into, nawet poprzez copy do tabeli tempowej ale nic nie pomogło.
Nie mam zielonego pojęcia.
mortus
30.12.2011, 14:41:55
Zwykły UPDATE + SELECT:
UPDATE adres
SET kodpocztowy = (
SELECT kodpocztowy
FROM adres a1
WHERE a1.miejscowosc = adres.miejscowosc AND a1.ulica = adres.ulica AND a1.rokurodzenia <> 1978 AND kodpocztowy <> '00-000'
LIMIT 1
)
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
1.01.2012, 22:55:04
Cytat(mortus @ 30.12.2011, 14:41:55 )

Zwykły UPDATE + SELECT:
UPDATE adres
SET kodpocztowy = (
SELECT kodpocztowy
FROM adres a1
WHERE a1.miejscowosc = adres.miejscowosc AND a1.ulica = adres.ulica AND a1.rokurodzenia <> 1978 AND kodpocztowy <> '00-000'
LIMIT 1
)
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
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.
mkarach
2.01.2012, 09:29:34
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.