Left Outer Join - problem
Tdobe - 04-07-2007 00:01
Left Outer Join - problem
Mam problem z pewnym selektem, left outer joinem i where
Czyli mam dwie tabele:
Tabela nr 1: Panstwa
Panstwa_id | Panstwo -----------------+------------------ 1 | Polska 2 | Czechy 3 | Rosja
Panstwo_id (PK)
Tabela nr2: Obywatele
Obywatel_id | Panstwo_id | Nazwisko | rok urodzenia ------------------+------------------+-------------- +---------------------- 20 | 1 | Kowalski | 1978 21 | 1 | Nowak | 1882 22 | 1 | Boniek | 1965 23 | 2 | Harvad | 1966 24 | 2 | Munzar | 1988 25 | 3 | Putin | 1945
Obywatel_id (PK) FK (Panstwo_id)
I teraz za pomocą złączenia lewego zewnętrznego chciałbym uzyskać listę wszystkich państw oraz par Państwo - Osoba z rokiem urodzenia pomiędzy 1982 a 2000
Czyli oczekiwany wynik wyglądałby następująco:
# |Panstwo_id | Państwo | Obywatel_id | Nazwisko | rok urodzenia --------------------+-------------+-------------------+--------------- +---------------------- 1|1 | Polska | 21 | Nowak | 1982 2|2 | Czechy | 24 | Munzar | 1988 3|3 | Rosja | null | null | null
wstepnie widzialbym to tak:
select a.panstwo_id, a.panstwo, b.obywatel_id, b.nazwisko, b.rok_urodzenia from panstwa a left outer join obywatele b on(a.panstwo_id = b.panstwo_id) where (b.rok_urodzenia between 1982 and 2000)or(b.rok_urodzenia is null)
problem w tym ze czegos brakuje, gdyz takie zapytanie nie wygeneruje rekordu #3, gdyz rok urodzenia putina ani nie bedzie nullem (gdyz zostanie on połączony poprzez left outer join - czyli po prawej będą dane) ani nie zawiera się w warunku between, wiec rekord z panstwem nr 3 nie bedzie wogole wyświetlony.
Podejrzewam ze trzeba sprytniej skonstruować warunek where, albo cos jeszcze o czym nie wiem...
Sylwester Lewandowski - 04-07-2007 00:01
Witam,
Myslę, że to tak powinno wyglądać:
SELECT P.panstwo_id, P.panstwo_nazwa, O.obywatel_id,O.nazwisko, O.wiek FROM Panstwa P LEFT JOIN Obywatele O ON O.panstwo_id = P.panstwo_id AND O.wiek BETWEEN 1982 AND 2000
PS. Masz błąd w danych ;):
21 | 1 | Nowak | *1882*
a wynik z posta to: 1|1 | Polska | 21 | Nowak | *1982*
Pozdrawiam, Sylwester Lewandowski
Tdobe - 05-07-2007 00:00
juz sprawdzam, a blad jest bo pisalem z "czapki"
Tdobe - 05-07-2007 00:00
Dokładnie tak ma być, taki pomysł też mi przechodził przez głowę, ale jakoś tego nie wyprobowałem,
dzięki jeszcze raz
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[MSSQL2000] Problem z =?ISO-8859-2?Q?tabel=B1/indeksem/zapytanie?==?ISO-8859-2?Q?m_czy_b=B3=B1d_w_bazie_danych=2E=2E=2E?=
mysql i mysql-front, problem
String line; if (line=="cos"){...}....problem
Problemy z =?ISO-8859-2?Q?instalacj=B1_PostgreSQL_na_syste?==?ISO-8859-2?Q?mach_Windows?=
[postgres] Problem z =?ISO-8859-2?Q?zmian=B1_struktury_i_z?==?ISO-8859-2?Q?ale=BFno=B6ciami=2E?=
[oracle] =?ISO-8859-2?Q?zmia=BFd=BFony_przez_problem=3A_za?==?ISO-8859-2?Q?pytanie_do_hierarchi?=
Problem z wartościami w MySQL :( [ MySQL and ASP and VBScript ]
[PGSQL] czy ktos mial problemy z initdb pgsql 8.1 ?
[MySQL] Problem z zapisem danych w bazie danych
Problem z mysql - can't connect to MySQL/nietypowo...
zanotowane.pldoc.pisz.plpdf.pisz.plbajkomoda.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|