JOIN i trzy tabelki
ykk - 14-05-2006 00:47
JOIN i trzy tabelki
Witam,
Proszę o wskazanie wydajniejszego rozwiązania poniższego problemu Mam trzy tabel A, B,C mające jakies wspólne pola dajmy na to id.
Potrzebuję aby wynik zapytania zwrócił wszystkie rekordy z A dla których nie istnieją odpowiednie id w tabeli B "A.id != B.id" oraz do wszystkiego co zostało dodał rekordy z C jeśłi istnieją (jeśli nie to puste dane)
jak na razie tylko coś takiego przychodzi mi do głowy:
Select A.id, B.id, C.id from A left join B on (A.id =B.id) left join C on (A.id=C.id) where B.id is null
jeszcze nie miałem okazji przetestować tego i nie wiem czy to rozwiąże mój poblem - ale może istneje jakieś lepsze rozwiązanie
-- Pozdrawiam Karol Kostanek www.karol.boo.pl ~~~~~~~~~~~ ~~~~_/)~~~~ ~~~~~~~~~~~
ykk - 14-05-2006 00:48
> Proszę o wskazanie wydajniejszego rozwiązania poniższego problemu > Mam trzy tabel A, B,C mające jakies wspólne pola dajmy na to id. > > Potrzebuję aby wynik zapytania zwrócił wszystkie rekordy z A dla których > nie istnieją odpowiednie id w tabeli B "A.id != B.id" > oraz do wszystkiego co zostało dodał rekordy z C jeśłi istnieją (jeśli nie > to puste dane) > > jak na razie tylko coś takiego przychodzi mi do głowy: > > Select A.id, B.id, C.id from > A left join B on (A.id =B.id) left join C on (A.id=C.id) > where B.id is null > > jeszcze nie miałem okazji przetestować tego i nie wiem czy to rozwiąże mój > poblem - ale może istneje jakieś lepsze rozwiązanie > >
Właśnie przetestowałem i nie dizał tak jakbym chciał ... dodam że urumamiane jest w PHP przez ODBC - może to tu jest problem ????
-- Pozdrawiam Karol Kostanek www.karol.boo.pl ~~~~~~~~~~~ ~~~~_/)~~~~ ~~~~~~~~~~~
ThomasO@cpas.com - 14-05-2006 00:48
Karol, select ,A.id from A MINUS select B.id from B UNION select C.id from C
ykk - 14-05-2006 00:48
> select ,A.id from A > MINUS > select B.id from B > UNION > select C.id from C
Dzieki,
W poprzednim poscie chyba za bardzo to uproscilem - i nie bardzo wiem jak to przerobic na MINUS i UNION:
select A.dane1, A.id, A.dane2, C.dane3, A.dane4, A.dane5 from TABELA1 A left join TABELA2 B on (A.id = B.id and A.id2 = B.id2) left join TABELA3 C on (A.id3 = C.id3) where A.dane0 != 'D' and B.dane0 != 'D' and C.dane0 != 'D' and A.dane1 = 'jakas wartosc'
ale niestety w wyniku sa tylko te wiersze z A w których A.id = B.id - nie sa dorzucane te wiersze dla których nie ma odpowiednika id w B i dodatkowo sa kilkatrotnie zdublowane niestety zakres potrzebnych danych z A jest szerszy niz samo id - i dodatkowo jest kilka warunków ....
-- Pozdrawiam Karol Kostanek www.karol.boo.pl ~~~~~~~~~~~ ~~~~_/)~~~~ ~~~~~~~~~~~
ThomasO@cpas.com - 14-05-2006 00:48
Karol, Jaka baza danych? SQL roznia sie zaleznie od bazy. Thomas
mhm - 14-05-2006 00:48
ykk napisał(a): > Witam, > > Proszę o wskazanie wydajniejszego rozwiązania poniższego problemu > Mam trzy tabel A, B,C mające jakies wspólne pola dajmy na to id. > > Potrzebuję aby wynik zapytania zwrócił wszystkie rekordy z A dla których nie > istnieją odpowiednie id w tabeli B "A.id != B.id" > oraz do wszystkiego co zostało dodał rekordy z C jeśłi istnieją (jeśli nie > to puste dane) > > jak na razie tylko coś takiego przychodzi mi do głowy: > > Select A.id, B.id, C.id from > A left join B on (A.id =B.id) left join C on (A.id=C.id) > where B.id is null > > jeszcze nie miałem okazji przetestować tego i nie wiem czy to rozwiąże mój > poblem - ale może istneje jakieś lepsze rozwiązanie > > >
select A.id, C.id from A left join C on (A.id = C.id)
except
select B.id, C.id from B left join C on (B.id = C.id);
-- mhm.
mhm - 14-05-2006 00:48
mhm napisał(a): > ykk napisał(a): > >> Witam, >> >> Proszę o wskazanie wydajniejszego rozwiązania poniższego problemu >> Mam trzy tabel A, B,C mające jakies wspólne pola dajmy na to id. >> >> Potrzebuję aby wynik zapytania zwrócił wszystkie rekordy z A dla >> których nie istnieją odpowiednie id w tabeli B "A.id != B.id" >> oraz do wszystkiego co zostało dodał rekordy z C jeśłi istnieją (jeśli >> nie to puste dane) >> >> jak na razie tylko coś takiego przychodzi mi do głowy: >> >> Select A.id, B.id, C.id from >> A left join B on (A.id =B.id) left join C on (A.id=C.id) >> where B.id is null >> >> jeszcze nie miałem okazji przetestować tego i nie wiem czy to rozwiąże >> mój poblem - ale może istneje jakieś lepsze rozwiązanie >> >> >> > > select > A.id, C.id > from > A left join C on (A.id = C.id) > > except > > select > B.id, C.id > from > B left join C on (B.id = C.id); >
nie doczytałam. zamiast left join wstaw left outer join.
-- mhm.
ykk - 16-05-2006 00:15
> Jaka baza danych? > SQL roznia sie zaleznie od bazy.
DB2
-- Pozdrawiam Karol Kostanek www.karol.boo.pl ~~~~~~~~~~~ ~~~~_/)~~~~ ~~~~~~~~~~~
Artur - 16-05-2006 00:15
Da się to zrobić też tak:
select t.id, t.c2, t.c3, c.t2 (select id,c2,c3 from A except select id,c2,c3 from B) as t left outer join C on t.id = c.id
czyli to co jest w nawiasach traktowane jest jak tabela, do której odwołujesz się przez nazwę t i dalej robisz dowolne złączenie.
Jeśli chcesz pocztać więcej o możliwych konstrukcjach w DB2 polecam damową książkę, DB2 SQL Cook Book:
http://mysite.verizon.net/Graeme_Birchall/id1.html
-- Artur Wronski
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[MySQL] Wybierz tylko te rekordy z t1 =?ISO-8859-2?Q?kt=F3rych_?==?ISO-8859-2?Q?nie_ma_w_t2=2E_JOIN_=3F?=
=?iso-8859-2?Q?Problem_z_left_join_-_=B3=B1czenie_kilku_tabel.?=
=?iso-8859-2?q?SQL:_left_join:_dublowanie_wynik=F3w?=
mysql: left join group by order by - problem z sortowaniem
[mysql, postgres] poprawne uzycie GROUP BY i JOIN
[MySQL] wiele tabel w left join
[MySQL] LEFT JOIN - strasznie wolny
[MySql] pytanie o relacje, JOIN
Zapytanie na 3 tabele, JOIN itp.
LEFT OUTER JOIN v. UNION
zanotowane.pldoc.pisz.plpdf.pisz.plshanti.opx.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 |
|