Prosze o pomoc w zbuduwaniu zapytania
jh - 20-02-2006 14:09
Prosze o pomoc w zbuduwaniu zapytania
Baza to OracleRdb 7.0.
Mam problme ze zbudowaniem SELECTa. Uczę się sam SQLa i zapętliłem się już w zapytaniu :) za dużo tych WHEREów mi wychodzi :P i nie wygląda to ładnie.
Tabele są bardzo rozbudowane, dlatego podam tylko te pola, które mnie teraz interesują. Typy pól też w uproszczeniu (opisowo).
Tabela BROADCAST( BROADCAST_ID Integer, BROADCAST_TIME Timestamp TAKE_ID Integer)
Tabela TAKE( TAKE_ID Integer, CLASS_ID)
Tabela CLASSES( CLASS_ID Integer, CLASS_NAME string)
Tabela TAKE_TITLE( TAKE_TITLE_ID Integer, TAKE_ID Integer, TITLE_ID Integer)
Tabela TITLE( TITLE_ID Integer, TITLE String)
Tabela TAKE_PERSON( TAKE_PERSON_ID Integer, TAKE_ID Integer, PERSON_ID Integer)
Tabela PERSON( PERSON_ID Integer, PERSON_NAME String)
Tabela PERSON_FLAGS( PERSON_FLAGS_ID Integer, PERSON_ID Integer, FLAG_ID Integer)
Tabela FLAGS( FLAG_ID Integer, FLAG_NAME string)
Zapytanie ma wybrać z tabeli BROADCAST te rekordy, których BROADCAST_TIME mieści w podanym zakresie dat i godzin (Timestamp np.: 01-JAN-2006 12:00:00.00) i konkretnego FLAGS_ID z tabeli FLAGS. Dla każdego otrzymanego rekordu z BROADCAST i wartości TAKE_ID mam podobierać różne informacje. Te, które są w tabeli wprost w tabeli TAKE - pominąłem, bo tu filozofii nie ma ;) Ale chodzi mi o resztę. Wynikowo chcę otrzymać:
BROADCAST_TIME | TITLE | CLASS_NAME | PERSON_NAME | FLAG_NAME
Druga wersja zapytania - chcę otrzymać w wyniku wszystkie FLAG_ID jakie są powiązane z TAKE_ID przy zapytaniu o BROADCAST_TIME - jak wyżej.
Pewnie dla Was to banalne, ale mnie się to nieco miesza...
Jacek
Marcin - 20-02-2006 14:10
jh wrote: > Baza to OracleRdb 7.0. > > Mam problme ze zbudowaniem SELECTa. Uczę się sam SQLa i zapętliłem się już w > zapytaniu :) za dużo tych WHEREów mi wychodzi :P i nie wygląda to ładnie. > > Tabele są bardzo rozbudowane, dlatego podam tylko te pola, które mnie teraz > interesują. Typy pól też w uproszczeniu (opisowo). >
Jedna uwaga. Posty typu: Dane: Twoje Szukane: Twoje Rozwiązanie: grupy
nie są tu szczególnie mile widziane. Jeśli napiszesz szkic rozwiązania i powiesz, w którym miejscu masz problem, to na pewno ktoś chętnie Ci pomoże. Tak mi się przynajmniej wydaje.
M.
Noel - 20-02-2006 14:10
Użytkownik jh napisał:
> > Pewnie dla Was to banalne, ale mnie się to nieco miesza... >
Trzeba umieścić w instrukcji SELECT wszystkie tabele, a potem pieczołowicie łączyć je ze sobą. Coś takiego:
SELECT B.BROADCAST_TIME, T.TITLE, C.CLASS_NAME, P.PERSON_NAME, F.FLAG_NAME FROM BROADCAST B, TITLE T, CLASSES C, PERSON P, FLAGS F, TAKE TK, PERSON_FLAGS PF, TAKE_PERSON TP, TAKE_TITLE TT WHERE B.TAKE_ID = TK.TAKE_ID AND TK.CLASS_ID = C.CLASS_ID AND T.TITLE_ID = TT.TITLE_ID AND P.PERSON_ID = TP.PERSON_ID AND PF.FLAG_ID = F.FLAG_ID AND PF.PERSON_ID = P.PERSON_ID AND TP.TAKE_ID = TK.TAKE_ID AND TT.TAKE_ID = TK.TAKE_ID AND B.BROADCAST_TIME BETWEEN X AND Y;
-- Tomek "Noel" B.
jh - 20-02-2006 14:10
Użytkownik "Marcin" <spam@noaddress.xx> napisał w wiadomości news:dtbus6$lau$1@atlantis.news.tpi.pl... > Jedna uwaga. Posty typu: > Dane: Twoje > Szukane: Twoje > Rozwiązanie: grupy
> nie są tu szczególnie mile widziane.
W temacie (sorry za literówkę) poprosiłem o pomoc w zbudowaniu zapytania, a nie wykazaniu mojego błędu. Nie bardzo wiem, gdzie popełniłem nietakt...
Jacek
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 20-02-2006 14:10
jh wrote: > Użytkownik "Marcin" <spam@noaddress.xx> napisał w wiadomości > news:dtbus6$lau$1@atlantis.news.tpi.pl... > >>Jedna uwaga. Posty typu: >>Dane: Twoje >>Szukane: Twoje >>Rozwiązanie: grupy > > >>nie są tu szczególnie mile widziane. > > > W temacie (sorry za literówkę) poprosiłem o pomoc w zbudowaniu zapytania, a > nie wykazaniu mojego błędu. Nie bardzo wiem, gdzie popełniłem nietakt...
W tym, że poprosiłeś, żeby zrobić coś ZA CIEBIE. Napisz zapytanie sam. Jeśli Ci nie działa tak jak chcesz, albo wogóle, to wtedy pokażemy Ci błąd. Dlaczego tak - ja znajduje 3 główne powody. - jest to dodatkowa informacja, do często niejasnego opisu - oszczędza czasu odpisującym, bo często wystarczy poprawić jedną linijke w czasem całkiem długich zapytaniach. - pozwala odsiać tych, co chcą wykorzystać innych do odrobienia swojego zadania, czy to ze szkoły, czy to w pracy.
-- P.M.
jh - 20-02-2006 14:10
Użytkownik "Paweł Matejski" <madej@spam.madej.pl.eu.org> napisał w wiadomości news:dtcbnk$kqt$1@inews.gazeta.pl... >Nie bardzo wiem, gdzie popełniłem nietakt...
> W tym, że poprosiłeś, żeby zrobić coś ZA CIEBIE. Napisz zapytanie sam. > Jeśli Ci nie działa tak jak chcesz, albo wogóle, to wtedy pokażemy Ci > błąd.
> - pozwala odsiać tych, co chcą wykorzystać innych do odrobienia swojego > zadania, czy to ze szkoły, czy to w pracy.
A;-) OK. Tak w ogóle to za stary jestem na studiowanie, pracuję w innym zawodzie - to raczej jako hobby. Trochę mi wstyd mojej nieudolności. Oto, co spłodziłem. Jak przyjrzałem się temu, co napisał Noel to chyba jest to samo:
select br.BROADCAST_TIME, cl.CLASS_NAME, t.TITLE, p.PERSON_NAME, f.FLAG_NAME from BROADCAST br, CLASSES cl, TITLE t, PERSON p, FLAGS f, PERSON_FLAGS pf, TAKE_PERSON tp, TAKE tk where (f.FLAG_ID=pf.FLAG_ID) and (pf.PERSON_ID=p.PERSON_ID) and (tp.TAKE_ID=br.TAKE_ID) and (tp.PERSON_ID=p.PERSON_ID) and (cl.CLASS_ID = tk.CLASS_ID) and (tk.TAKE_ID=br.TAKE_ID) and (br.BROADCAST_TIME >(20-FEB-2006 13:00:00.00));
Wpisy w bazie na pewno są, tylko chyba źle pytam, bo nie dostaje nic na zapytanie.Przyznam, że mam problem z joinami i nie wiem, czy tu nie powinienem robić złączeń - czy wtedy (jeśli zadziała) nie będzie szybciej niż te "where'y"?
Jacek
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 22-02-2006 21:47
jh wrote: > Użytkownik "Paweł Matejski" <madej@spam.madej.pl.eu.org> napisał w > wiadomości news:dtcbnk$kqt$1@inews.gazeta.pl... > >>Nie bardzo wiem, gdzie popełniłem nietakt... > > >>W tym, że poprosiłeś, żeby zrobić coś ZA CIEBIE. Napisz zapytanie sam. >>Jeśli Ci nie działa tak jak chcesz, albo wogóle, to wtedy pokażemy Ci >>błąd. > > >>- pozwala odsiać tych, co chcą wykorzystać innych do odrobienia swojego >>zadania, czy to ze szkoły, czy to w pracy. > > > A;-) OK. Tak w ogóle to za stary jestem na studiowanie, pracuję w innym > zawodzie - to raczej jako hobby. Trochę mi wstyd mojej nieudolności. Oto, co > spłodziłem. Jak przyjrzałem się temu, co napisał Noel to chyba jest to samo: > > select br.BROADCAST_TIME, cl.CLASS_NAME, t.TITLE, p.PERSON_NAME, f.FLAG_NAME > from BROADCAST br, CLASSES cl, TITLE t, PERSON p, FLAGS f, PERSON_FLAGS pf, > TAKE_PERSON tp, TAKE tk > where > (f.FLAG_ID=pf.FLAG_ID) and > (pf.PERSON_ID=p.PERSON_ID) and > (tp.TAKE_ID=br.TAKE_ID) and > (tp.PERSON_ID=p.PERSON_ID) and > (cl.CLASS_ID = tk.CLASS_ID) and > (tk.TAKE_ID=br.TAKE_ID) and > (br.BROADCAST_TIME >(20-FEB-2006 13:00:00.00));
Czy napewno data ma być w nawiasie a nie w ''?
> Wpisy w bazie na pewno są, tylko chyba źle pytam, bo nie dostaje nic na > zapytanie.
No, nie byłbym taki pewny. Warunków jest kilka i można się już pomylić. Proponuje po kolei usuwać najmniej znaczące tabele z zapytani i popatrzyć kiedy rekordy zaczną się pojawiać.
> Przyznam, że mam problem z joinami i nie wiem, czy tu nie > powinienem robić złączeń - czy wtedy (jeśli zadziała) nie będzie szybciej > niż te "where'y"?
Nie będzie.
-- P.M.
jh - 22-02-2006 21:47
Użytkownik "Paweł Matejski" <madej@spam.madej.pl.eu.org> napisał w wiadomości news:dtciit$pc9$1@inews.gazeta.pl... >> select br.BROADCAST_TIME, cl.CLASS_NAME, t.TITLE, p.PERSON_NAME, >> f.FLAG_NAME >> from BROADCAST br, CLASSES cl, TITLE t, PERSON p, FLAGS f, PERSON_FLAGS >> pf, TAKE_PERSON tp, TAKE tk >> where >> (f.FLAG_ID=pf.FLAG_ID) and >> (pf.PERSON_ID=p.PERSON_ID) and >> (tp.TAKE_ID=br.TAKE_ID) and >> (tp.PERSON_ID=p.PERSON_ID) and >> (cl.CLASS_ID = tk.CLASS_ID) and >> (tk.TAKE_ID=br.TAKE_ID) and >> (br.BROADCAST_TIME >(20-FEB-2006 13:00:00.00)); > > Czy napewno data ma być w nawiasie a nie w ''?
Tak. Z tym, że do zapytań muszę używać specjalnego programiku dostępowego, w którym zapytania mają specyficzny zapis - przerabiam je.
> Proponuje po kolei usuwać najmniej znaczące tabele z zapytani i popatrzyć > kiedy rekordy zaczną się pojawiać.
Tak zrobiłem.
>> czy wtedy (jeśli zadziała) nie będzie szybciej niż te "where'y"?
> Nie będzie.
Masz rację. Przy okazji widać ten specyficzny zapis (Parametr po "pipe", a potem jego typ, po kolejnym "pipe"):
select|br.BROADCAST_TIME, p.PERSON_NAME from BROADCAST br, PERSON p, TAKE_PERSON tp where (br.BROADCAST_TIME >|20-FEB-2006 13:00:00.00|D) and (tp.TAKE_ID=br.TAKE_ID) and (tp.PERSON_ID=p.PERSON_ID) limit to 20 rows|
na wynik czekałem 36s
select|br.BROADCAST_TIME, p.PERSON_NAME from PERSON p, BROADCAST br inner join TAKE_PERSON tp on (tp.TAKE_ID=br.TAKE_ID) where (p.PERSON_ID = tp.PERSON_ID) and (br.BROADCAST_TIME >|20-FEB-2006 13:00:00.00|D) limit to 20 rows|
Tu na wynik czekałem 42s.
Czy w Oracle jest tak jak w innych językach programowania, że kiedy warunek AND nie jest spełniony pozostałe nie są już sprawdzane? To tłumaczyłoby mi szybsze 'where'...
Jacek
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
=?ISO-8859-2?Q?Narz=EAdzie_do_budowania_zapyta=F1_SQL=2C?==?I SO-8859-2?Q?_PL/PgSQL=2C_PL/SQL=2C_T-SQL?=
[ms sql] =?ISO-8859-2?Q?wy=B6wietlenie_pierwszych_5_rekord?==?ISO-8859-2?Q?=F3w_z_zapytania_=3F_odpowiednik_ROWNUM_w_o?== ?ISO-8859-2?Q?raclu_dla_MS_SQL=27a?=
phpMyAdmin zadaje =?ISO-8859-2?Q?z=B3e_zapytania=2E=2E=2E_Dl?==?ISO-8859-2?Q?aczego=3F?=
[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 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
[mysql/php] jak =?ISO-8859-2?Q?zliczy=E6_ilo=B6=E6_unikalnyc?==?ISO-8859-2?Q?h_rekord=F3w_w_jednym_zapytaniu=3F?=
[MySQL] Zapytanie z =?ISO-8859-2?Q?dw=F3ch_tabel_na_raz_?==?ISO-8859-2?Q?i_grupowanie_po_wsp=F3lnym_polu=2E_Jak_=3F?=
mecze sie i mecze i nic - zapytanie czesciowe
zanotowane.pldoc.pisz.plpdf.pisz.plfelgiuzywane.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 |
|