zapytanie w Oracle 9i
Michał Sienkiewicz - 21-12-2005 12:16
zapytanie w Oracle 9i
Witam,
Mam następującą tabelę (kolumny): ID NAME QUANTITY
Potrzebuję napisać zapytanie, które powinno zwracać wiersze zdublowane tyle razy ile wynosi wartość QUANTITY Czyli przykładowo, jeżeli tabela zawiera wiersze: ID NAME QUANTITY 1 test 3 2 test2 1
powinienem otrzymać rezultat: 1 test 1 test 1 test 2 test2
Jak napisać takie zapytanie w Oracle 9i.
Pozdrawiam, Michał Sienkiewicz
Marcin - 27-12-2005 10:16
Michał Sienkiewicz wrote: > Mam następującą tabelę (kolumny): > ID > NAME > QUANTITY > > Potrzebuję napisać zapytanie, które powinno zwracać wiersze zdublowane tyle > razy ile wynosi wartość QUANTITY > Czyli przykładowo, jeżeli tabela zawiera wiersze: > ID NAME QUANTITY > 1 test 3 > 2 test2 1 > > powinienem otrzymać rezultat: > 1 test > 1 test > 1 test > 2 test2 >
Za pomocą zapytania SQL z jednej tabeli chyba się nie da. Możesz utworzyć pomocniczą tabelkę z kolejnymi liczbami z jakiegoś zakresu i połączyć z nią wynik:
tabelka lp(qty): 1 2 3 4 ....
SELECT id, name FROM tabela JOIN lp ON lp.qty <= tabela.qty;
albo dynamicznie tworzyć zapytanie w procedurze.
M.
Michał Sienkiewicz - 27-12-2005 10:16
> Michał Sienkiewicz wrote: >> Mam następującą tabelę (kolumny): >> ID >> NAME >> QUANTITY >> >> Potrzebuję napisać zapytanie, które powinno zwracać wiersze zdublowane >> tyle >> razy ile wynosi wartość QUANTITY >> Czyli przykładowo, jeżeli tabela zawiera wiersze: >> ID NAME QUANTITY >> 1 test 3 >> 2 test2 1 >> >> powinienem otrzymać rezultat: >> 1 test >> 1 test >> 1 test >> 2 test2 >> > > Za pomocą zapytania SQL z jednej tabeli chyba się nie da. > Możesz utworzyć pomocniczą tabelkę z kolejnymi liczbami > z jakiegoś zakresu i połączyć z nią wynik: > > tabelka lp(qty): > 1 > 2 > 3 > 4 Trochę mało eleganckie rozwiązanie szczególnie, że nie znam ograniczenia quantity od góry. A czy da się napisać zapytanie które wygeneruje mi taką sekwencję? Wtedy mógłbym wykonać nastepujące zapytanie:
SELECT t.id, t.name FROM tabela t, (select num from sekwencja numerkow) tmp where t.quantity >= tmp.num
> SELECT id, name FROM tabela JOIN lp ON lp.qty <= tabela.qty; > > albo dynamicznie tworzyć zapytanie w procedurze. >
wk - 27-12-2005 10:16
Użytkownik "Marcin" <spam@noaddress.xx> napisał w wiadomości news:dobiur$8s$1@nemesis.news.tpi.pl... > Michał Sienkiewicz wrote: > > ..... > > Potrzebuję napisać zapytanie, które powinno zwracać wiersze > > zdublowane tyle razy ile wynosi wartość QUANTITY > > > > Za pomocą zapytania SQL z jednej tabeli chyba się nie da. > Możesz utworzyć pomocniczą tabelkę z kolejnymi liczbami > z jakiegoś zakresu i połączyć z nią wynik:
Zamiast pomocniczej tabeli można skorzystać z TABLE FUNCTION (w połączeniu z typem) - zaletą jest to że nie trzeba tworzyć tabeli i wypełniać jej wartościami :) - zaś wadą, że trzeba napisać funkcję z pragmą pipelined i utworzyć typ Wybór należy do Ciebie
-- Wk
Michał Sienkiewicz - 27-12-2005 10:16
>> > Potrzebuję napisać zapytanie, które powinno zwracać wiersze >> > zdublowane tyle razy ile wynosi wartość QUANTITY >> > >> >> Za pomocą zapytania SQL z jednej tabeli chyba się nie da. >> Możesz utworzyć pomocniczą tabelkę z kolejnymi liczbami >> z jakiegoś zakresu i połączyć z nią wynik: > > Zamiast pomocniczej tabeli można skorzystać z TABLE FUNCTION > (w połączeniu z typem) > - zaletą jest to że nie trzeba tworzyć tabeli i wypełniać jej wartościami > :) > - zaś wadą, że trzeba napisać funkcję z pragmą pipelined i utworzyć typ > Wybór należy do Ciebie Ok, już mam: http://www.akadia.com/services/ora_pipe_functions.html
wk - 27-12-2005 10:16
Użytkownik "Michał Sienkiewicz" <msienkie_nospam@interia.pl> napisał w wiadomości news:dobobk$2ne$1@atlantis.news.tpi.pl... > Ok, już mam: > http://www.akadia.com/services/ora_pipe_functions.html > i o to chodziło :)
-- Wk
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle 19g +Insert +Insert +Insert...
[Oracle] jak =?ISO-8859-2?Q?ograniczy=E6_pami=EA=E6_dla_se?==?ISO-8859-2?Q?rwera=3F?=
=?ISO-8859-2?Q?=5BOT=5D_Zdany_egzamin_Oracle_1Z0-007_a?==?ISO-8859-2?Q?_brak_informacji_na_stronie_Prometric_-_czy?==?ISO-8859-2?Q?_co=B6_nie_tak=3F?=
[oracle] czy da =?ISO-8859-2?Q?si=EA_z_poziomu_procedury_?==?ISO-8859-2?Q?zrobi=E6_kopi=EA_zapasow=B1=3F?=
[oracle 10g] czy =?ISO-8859-2?Q?mo=BFna_wy=B3=B1czy=E6_wszys?==?ISO-8859-2?Q?tkie_wi=EAzy_w_schemacie=3F?=
MSSQL Express czy Oracle Express
=?iso-8859-2?q?[oracle]_Jak_sprawdzi=E6_wielko=B6=E6_tabeli_=3F=3F?=
=?ISO-8859-2?Q?Poszukjue_ksi=B1=BFki_"Oracle_?= =?ISO-8859-2?Q?optymalizacja_wydajno=B6ci"..?=
Oracle PL/SQL Wstawianie =?ISO-8859-2?Q?wynik=F3w_kolekcji_d?==?ISO-8859-2?Q?o_tabeli?=
=?iso-8859-2?q?[oracle_10g]_jak_da=E6_grant_do_gv$=2E=2E=2E=2E_=3F?=
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 |
|