ďťż
 
Prosze o pomoc w zbuduwaniu zapytania ďťż
 
Prosze o pomoc w zbuduwaniu zapytania
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • felgiuzywane.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com