[oracle] =?ISO-8859-2?Q?zmia=BFd=BFony_przez_problem=3A_za?==?ISO-8859-2?Q?pytanie_do_hierarchi?=
T-BAG - 27-07-2007 00:01
[oracle] =?ISO-8859-2?Q?zmia=BFd=BFony_przez_problem=3A_za?==?ISO-8859-2?Q?pytanie_do_hierarchi?=
witam!
zmiażdżył mnie następujący problem. jest tablica zawierająca powiązane z sobą kolumny (elementy zamówienia). jej fragment wygląda tak:
nbr child D/U parent grupa ---|------|-----|------|---- 1 | P1 | D | | 2 | P2 | D | | 3 | P3 | D | | 4 | T1 | U | P1 | T 5 | T5 | D | P1 | T 6 | T4 | D | P3 | T 7 | A1 | N | P2 | H 8 | A7 | D | P3 | H
na przykład, na pozycji 8 znajduje się element A7, który jest z grupy H, został dodany (D), a elementem nadrzędnym dla niego jest P3.
przy wyborze elementu P1 chciałbym uzyskać poniższy wiersz:
| elementy w | grupa T | grupa H | grupie bez nazwy | parent=P1 | !=P1 | parent=P1 | !=P1 ---|-------------------|---------------------|------------------------- P1 | D(P1),D(P2),D(P3) | U(T1),D(T5) | D(T4) | |N(A1),D(A7)
rozmyślam od dwóch dni, próbuję różnych funkcji typu rank(), magicznych CONNECT_BY_PATH itp. ale nie daję rady.
czy ktoś mógłby mnie naprowadzić na rozwiązanie, albo podać jakiś podobny przykład? zależy mi, aby zapytanie było możliwie wydajne. będę wdzięczny za wszelkie sugestie.
pozdrawiam! T-BAG
Thomas Olszewicki - 28-07-2007 00:01
=?iso-8859-2?q?Re:_zmia=BFd=BFony_przez_problem:_zapytanie_do _hierarchi?=
On Jul 26, 3:50 pm, T-BAG <T-...@prisonbreak.invalid.com> wrote: > witam! > > zmiażdżył mnie następujący problem. jest tablica zawierająca powiązane z > sobą kolumny (elementy zamówienia). jej fragment wygląda tak: > > nbr child D/U parent grupa > ---|------|-----|------|---- > 1 | P1 | D | | > 2 | P2 | D | | > 3 | P3 | D | | > 4 | T1 | U | P1 | T > 5 | T5 | D | P1 | T > 6 | T4 | D | P3 | T > 7 | A1 | N | P2 | H > 8 | A7 | D | P3 | H > > na przykład, na pozycji 8 znajduje się element A7, który jest z grupy H, > został dodany (D), a elementem nadrzędnym dla niego jest P3. > > przy wyborze elementu P1 chciałbym uzyskać poniższy wiersz: > > | elementy w | grupa T | grupa H > | grupie bez nazwy | parent=P1 | !=P1 | parent=P1 | !=P1 > ---|-------------------|---------------------|------------------------- > P1 | D(P1),D(P2),D(P3) | U(T1),D(T5) | D(T4) | |N(A1),D(A7) > > rozmyślam od dwóch dni, próbuję różnych funkcji typu rank(), magicznych > CONNECT_BY_PATH itp. ale nie daję rady. > > czy ktoś mógłby mnie naprowadzić na rozwiązanie, albo podać jakiś > podobny przykład? zależy mi, aby zapytanie było możliwie wydajne.będę > wdzięczny za wszelkie sugestie. > > pozdrawiam! > T-BAG
Nie bardzo rozumiem co Twoj wynik powinien robic. Mozesz to opisac jakos inaczej, co chcesz osiagnac? Na przyklad, nie widze powiazania miedzy P1 i A1, a jednak w Twoim przykladzie A1 jest wymienione w tym samym row co P1? Thomas
Maciej Iwanczewski - 28-07-2007 00:01
T-BAG napisał(a): > zmiażdżył mnie następujący problem. jest tablica zawierająca powiązane z > sobą kolumny (elementy zamówienia). jej fragment wygląda tak: > > nbr child D/U parent grupa > ---|------|-----|------|---- > 1 | P1 | D | | > 2 | P2 | D | | > 3 | P3 | D | | > 4 | T1 | U | P1 | T > 5 | T5 | D | P1 | T > 6 | T4 | D | P3 | T > 7 | A1 | N | P2 | H > 8 | A7 | D | P3 | H > > na przykład, na pozycji 8 znajduje się element A7, który jest z grupy H, > został dodany (D), a elementem nadrzędnym dla niego jest P3. > > przy wyborze elementu P1 chciałbym uzyskać poniższy wiersz: > > | elementy w | grupa T | grupa H > | grupie bez nazwy | parent=P1 | !=P1 | parent=P1 | !=P1 > ---|-------------------|---------------------|------------------------- > P1 | D(P1),D(P2),D(P3) | U(T1),D(T5) | D(T4) | |N(A1),D(A7) > > rozmyślam od dwóch dni, próbuję różnych funkcji typu rank(), magicznych > CONNECT_BY_PATH itp. ale nie daję rady. > > czy ktoś mógłby mnie naprowadzić na rozwiązanie, albo podać jakiś > podobny przykład? zależy mi, aby zapytanie było możliwie wydajne. będę > wdzięczny za wszelkie sugestie.
co do wydajności to nie mam pojęcia, ale znalazłem cos takiego: select rowtocol('select DU' || '||' || '''(''' || '||' || 'child' || '||' || ''')''' || ' from pe.test_parent where parent is null') as k1, rowtocol('select DU' || '||' || '''(''' || '||' || 'child' || '||' || ''')''' || ' from pe.test_parent where parent=''P1'' and grupa=''T''') as k2, rowtocol('select DU' || '||' || '''(''' || '||' || 'child' || '||' || ''')''' || ' from pe.test_parent where parent!=''P1'' and grupa=''T''') as k3, rowtocol('select DU' || '||' || '''(''' || '||' || 'child' || '||' || ''')''' || ' from pe.test_parent where parent=''P1'' and grupa=''H''') as k4, rowtocol('select DU' || '||' || '''(''' || '||' || 'child' || '||' || ''')''' || ' from pe.test_parent where parent!=''P1'' and grupa=''H''') as k5 from dual
gdzie rowtocol jest ze strony: http://www.oracle.com/technology/ora...04/050304.html CREATE OR REPLACE FUNCTION rowtocol( p_slct IN VARCHAR2, p_dlmtr IN VARCHAR2 DEFAULT ',' ) RETURN VARCHAR2 AUTHID CURRENT_USER AS TYPE c_refcur IS REF CURSOR; lc_str VARCHAR2(4000); lc_colval VARCHAR2(4000); c_dummy c_refcur; l number; BEGIN OPEN c_dummy FOR p_slct; LOOP FETCH c_dummy INTO lc_colval; EXIT WHEN c_dummy%NOTFOUND; lc_str := lc_str || p_dlmtr || lc_colval; END LOOP; CLOSE c_dummy; RETURN SUBSTR(lc_str,2); EXCEPTION WHEN OTHERS THEN lc_str := SQLERRM; IF c_dummy%ISOPEN THEN CLOSE c_dummy; END IF; RETURN lc_str; END;
U mnie działa :) Na oracle 10g Express
Pozdrawiam, Maciek
T-BAG - 29-07-2007 00:00
Thomas Olszewicki wrote: > On Jul 26, 3:50 pm, T-BAG <T-...@prisonbreak.invalid.com> wrote: >> witam! >> >> zmiażdżył mnie następujący problem. jest tablica zawierająca powiązane z >> sobą kolumny (elementy zamówienia). jej fragment wygląda tak: >> >> nbr child D/U parent grupa >> ---|------|-----|------|---- >> 1 | P1 | D | | >> 2 | P2 | D | | >> 3 | P3 | D | | >> 4 | T1 | U | P1 | T >> 5 | T5 | D | P1 | T >> 6 | T4 | D | P3 | T >> 7 | A1 | N | P2 | H >> 8 | A7 | D | P3 | H >> >> na przykład, na pozycji 8 znajduje się element A7, który jest z grupy H, >> został dodany (D), a elementem nadrzędnym dla niego jest P3. >> >> przy wyborze elementu P1 chciałbym uzyskać poniższy wiersz: >> >> | elementy w | grupa T | grupa H >> | grupie bez nazwy | parent=P1 | !=P1 | parent=P1 | !=P1 >> ---|-------------------|---------------------|------------------------- >> P1 | D(P1),D(P2),D(P3) | U(T1),D(T5) | D(T4) | |N(A1),D(A7) >> >> rozmyślam od dwóch dni, próbuję różnych funkcji typu rank(), magicznych >> CONNECT_BY_PATH itp. ale nie daję rady. >> >> czy ktoś mógłby mnie naprowadzić na rozwiązanie, albo podać jakiś >> podobny przykład? zależy mi, aby zapytanie było możliwie wydajne. będę >> wdzięczny za wszelkie sugestie. >> >> pozdrawiam! >> T-BAG > > Nie bardzo rozumiem co Twoj wynik powinien robic. > Mozesz to opisac jakos inaczej, co chcesz osiagnac? > Na przyklad, nie widze powiazania miedzy P1 i A1, > a jednak w Twoim przykladzie A1 jest wymienione w tym samym row co P1? > Thomas
Witam!
dokładnie tak: A1 nie ma powiązania z P1. hmm.. co by powiedzieć więcej.. może wyobraź sobie, że w przytoczonym przykładzie wszystkie wiersze w tabeli mają wspólny identyfikator ID. chciałbym uzyskać wynik, w którym widziałbym wszystkie elementy dla tego ID, które są i nie są powiązane z P1, i chciałbym to uzyskać w podziale na grupy do których te elementy należą.
w powyższym przykładzie A1 pojawia się wśród elementów nie posiadających związku parent-child z P1 (zastosowałem oznaczenie '!=P1' dla kolumn spełniających ten warunek); z wyniku widać także, że A1 należy do grupy H.
zadałem to samo pytanie na grupie oracle. uzyskałem poniższą odpowiedź, ale mam problemy z jej uruchomieniem:
http://groups.google.com/group/comp....68038003?fwc=1
może kogoś z Was zainspiruje i skłoni do podzielenia się własnymi sugestiami lub przyczynkiem do rozwiązania.
pozdrawiam! T-BAG
T-BAG - 29-07-2007 00:00
Maciej Iwanczewski wrote: > co do wydajności to nie mam pojęcia, ale znalazłem cos takiego: > select rowtocol('select DU' || '||' || '''(''' || '||' || 'child' || > '||' || ''')''' || ' from pe.test_parent where parent is null') as k1, > rowtocol('select DU' || '||' || '''(''' || '||' || 'child' || '||' || > ''')''' || ' from pe.test_parent where parent=''P1'' and grupa=''T''') > as k2, > rowtocol('select DU' || '||' || '''(''' || '||' || 'child' || '||' || > ''')''' || ' from pe.test_parent where parent!=''P1'' and grupa=''T''') > as k3, > rowtocol('select DU' || '||' || '''(''' || '||' || 'child' || '||' || > ''')''' || ' from pe.test_parent where parent=''P1'' and grupa=''H''') > as k4, > rowtocol('select DU' || '||' || '''(''' || '||' || 'child' || '||' || > ''')''' || ' from pe.test_parent where parent!=''P1'' and grupa=''H''') > as k5 > from dual > > gdzie rowtocol jest ze strony: > http://www.oracle.com/technology/ora...04/050304.html > CREATE OR REPLACE > FUNCTION rowtocol( p_slct IN VARCHAR2, > p_dlmtr IN VARCHAR2 DEFAULT ',' ) RETURN VARCHAR2 > AUTHID CURRENT_USER AS > TYPE c_refcur IS REF CURSOR; > lc_str VARCHAR2(4000); > lc_colval VARCHAR2(4000); > c_dummy c_refcur; > l number; > BEGIN > OPEN c_dummy FOR p_slct; > LOOP > FETCH c_dummy INTO lc_colval; > EXIT WHEN c_dummy%NOTFOUND; > lc_str := lc_str || p_dlmtr || lc_colval; > END LOOP; > CLOSE c_dummy; > RETURN SUBSTR(lc_str,2); > EXCEPTION > WHEN OTHERS THEN > lc_str := SQLERRM; > IF c_dummy%ISOPEN THEN > CLOSE c_dummy; > END IF; > RETURN lc_str; > END; > > > U mnie działa :) Na oracle 10g Express > > Pozdrawiam, > Maciek
Dzięki za odpowiedź, sprawdzę niebawem jak to działa.
uff, chyba miesiąc zajmie mi zrozumienie tego.
pozdrawiam! T-BAG
Maciej Iwanczewski - 29-07-2007 00:00
T-BAG napisał(a): > Maciej Iwanczewski wrote: >> co do wydajności to nie mam pojęcia, ale znalazłem cos takiego: >> select rowtocol('select DU' || '||' || '''(''' || '||' || 'child' || >> '||' || ''')''' || ' from pe.test_parent where parent is null') as k1, >> [...] > > Dzięki za odpowiedź, sprawdzę niebawem jak to działa. > > uff, chyba miesiąc zajmie mi zrozumienie tego.
Jako pomoc w zrozumieniu :)
select ('select DU' || '||' || '''(''' || '||' || 'child' || '||' || ''')''' || ' from pe.test_parent where parent is null') from dual
i tak dla każdego argumentu rowtocol :)
Pozdrawiam, Maciek
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle 19g +Insert +Insert +Insert...
MSSQL Express czy Oracle Express
[Oracle, Toad] Zaladowanie obiektu w TOAD
[Oracle][Reports30] 10G nie dziala razem z Reports3.0
[Oracle] catalog.sql i catproc.sql - bledy
klient oracle (zmiana domyslna klienta oracla)
[oracle] [xml] XML na bazie istniejacej struktury ?
[Oracle] W jaki sposób skopiować całą zawartość schemy jednego użytkownika do nowo utworzonego użytkownika?
mysql i mysql-front, problem
String line; if (line=="cos"){...}....problem
zanotowane.pldoc.pisz.plpdf.pisz.plfantazia.htw.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 |
|