[SQLite3] zapytanie rekurencyjne
Jacek 'Szumak' Kotlarski - 24-12-2006 00:38
[SQLite3] zapytanie rekurencyjne
Witam, jak to zrobić bez możliwości stworzenia funkcji plsql czego SQLite nie obsługuje?
A dokładnie sytuacja wygląda tak:
id | root_id | name ---+---------+------ 0 | 0 | aaa 1 | 0 | aab 2 | 0 | aac 3 | 2 | xxx 4 | 2 | xxx 5 | 4 | cccc 6 | 0 | dddd itd.
id - unikatowy identyfikator, root_id - identyfikator rekordu nadrzędnego w drzewiastej strukturze
Szukam możliwości zwrócenia całej gałęzi rekordów, np. dla rekordu id = 2 w powyższym przykładzie to będą id = [2, 3, 4, 5]. Ilość zagnieżdżeń może być nieograniczona. W chwili obecnej szukam sposobu na usunięcie całej gałęzi, próbowałem wymyślić coś z wykorzystaniem triggerów ale niestety, trigger sam siebie nie wywoła więc brakuje mi funkcjonalności gwarantującej propagację zapytania na całą grupę rekordów powiązanych ze sobą powyższą zależnością.
Jest to w ogóle możliwe czy trzeba oprogramować to po stronie klienta? -- : Jacek 'Szumak' Kotlarski : Stowarzyszenie OKSYWIE_NET : ::: < szumak at moja domena z nagłówka > : GG 2052377 ::: :::::::::: UWAGA: adres w nagłówku to SPAMTRAP ::::::::::
Jakub K. - 24-12-2006 00:38
Jacek 'Szumak' Kotlarski wrote: > Witam, jak to zrobić bez możliwości stworzenia funkcji plsql czego > SQLite nie obsługuje? [cut] > Szukam możliwości zwrócenia całej gałęzi rekordów, np. dla rekordu > id = 2 w powyższym przykładzie to będą id = [2, 3, 4, 5]. > Ilość zagnieżdżeń może być nieograniczona. > W chwili obecnej szukam sposobu na usunięcie całej gałęzi, próbowałem > wymyślić coś z wykorzystaniem triggerów ale niestety, trigger sam > siebie nie wywoła więc brakuje mi funkcjonalności gwarantującej > propagację zapytania na całą grupę rekordów powiązanych ze sobą > powyższą zależnością. > > Jest to w ogóle możliwe czy trzeba oprogramować to po stronie klienta?
Hmm, trigger `after delete', który by kasował wszystkie swoje `podrzedne' 1-szego stopnia. Trigger powinien się wtedy rekurencyjnie wywołać (reagując na kasowanie każdego z podrzędnych). W taki sposób złoży się całe drzewo. Powstaje pytanie, czy SQLite obsługuje triggery w sposób rekurencyjny i do którego poziomu? ;-)
Na deser, link: http://www.sqlite.org/lang_createtrigger.html
Pozdrawiam -- Jakub 'jezik/nemesis' Kolasa
Jakub K. - 24-12-2006 00:38
Jakub K. wrote: > > Hmm, trigger `after delete', który by kasował wszystkie swoje > `podrzedne' 1-szego stopnia. Trigger powinien się wtedy rekurencyjnie > wywołać (reagując na kasowanie każdego z podrzędnych). W taki sposób > złoży się całe drzewo. Powstaje pytanie, czy SQLite obsługuje triggery w > sposób rekurencyjny i do którego poziomu? ;-) > > Na deser, link: http://www.sqlite.org/lang_createtrigger.html > > Pozdrawiam
Doczytawszy szybko dokumentację, sam sobie odpowiem:
SQL Features That SQLite Does Not Implement (...) Complete trigger support There is some support for triggers but it is not complete. Missing subfeatures include FOR EACH STATEMENT triggers (currently all triggers must be FOR EACH ROW), INSTEAD OF triggers on tables (currently INSTEAD OF triggers are only allowed on views), and recursive triggers - triggers that trigger themselves.
....a więc, odpowiedź brzmi: sqlite nie obsługuje triggerów rekurencyjnie. W takiej sytuacji pozostaje Ci obsługa po stronie klienta, choć mam już w głowie jak to szybko i łagodnie wykonać. No, ale nie będę się dzielił na razie, zobaczymy co wymyślisz ;-)
Pozdrawiam Ciebie i samego siebie ;-) -- Jakub 'jezik/nemesis' Kolasa
Jacek 'Szumak' Kotlarski - 24-12-2006 00:38
Dnia Wed, 20 Dec 2006 17:07:16 +0100 osobie znanej jako "Jakub K." <jezik.NO-S_PAM@arker.pl> przyszło do głowy napisać co następuje:
> Jakub K. wrote: > > > > Hmm, trigger `after delete', który by kasował wszystkie swoje > > `podrzedne' 1-szego stopnia. Trigger powinien się wtedy > > rekurencyjnie wywołać (reagując na kasowanie każdego z > > podrzędnych). W taki sposób złoży się całe drzewo. Powstaje > > pytanie, czy SQLite obsługuje triggery w sposób rekurencyjny i do > > którego poziomu? ;-)
Właśnie coś takiego próbowałem wykonać zwłaszcza, że triggerów używam na usuwania danych z kilku powiązanych tablic...
> allowed on views), and recursive triggers - triggers that trigger > themselves.
.... a to jakoś udało mi się przeoczyć, dzięki, pomyślę jak ograniczyć ilość zapytań.
Pozdrawiam -- : Jacek 'Szumak' Kotlarski : Stowarzyszenie OKSYWIE_NET : ::: < szumak at moja domena z nagłówka > : GG 2052377 ::: :::::::::: UWAGA: adres w nagłówku to SPAMTRAP ::::::::::
hubert depesz lubaczewski - 24-12-2006 00:38
On 2006-12-20, Jacek 'Szumak' Kotlarski <lowcajeleni@oksywienet.org.pl> wrote: > Jest to w ogóle możliwe czy trzeba oprogramować to po stronie klienta?
zmień strukturę danych.
depesz
-- rower trekkingowy od złotówki http://www.allegro.pl/item151225399_...ywany_bcm.html
Jacek 'Szumak' Kotlarski - 24-12-2006 00:38
Dnia Wed, 20 Dec 2006 17:26:00 +0100 osobie znanej jako hubert depesz lubaczewski <depesz@depesz.com> przyszło do głowy napisać co następuje:
> zmień strukturę danych.
a jaką proponujesz?
Dane z tej tablicy w aplikacji użytkownika prezentowane są w treectrl i mają typową drzewiastą strukturę - w zasadzie nie ma większego problemu gdy ładuję pełny rekordset z głównej tablicy, bo jestem w prosty sposób w stanie uzyskać tablicę id rekordów wybranej gałęzi, schody zaczynają się gdy zachodzi konieczność wczytania tylko jednej takiej gałęziz dużej bazy danych lub właśnie usunięcia tych rekordów bez konieczności ładowania całości i tablicowania wybranych identyfikatorów. Pomyślałem by zachowywać dla każdego rekordu dodatkowo identyfikator jego root-rekordu co w prosty sposób rozwiązałoby pobieranie/kasowanie całej gałęzi lecz nie jest to zadowalające rozwiązanie z uwagi nafakt, że znacznie częściej będzie zachodziła konieczność pobrania/skasowania tylko małego fragmentu gałęzi od wskazanego punktu do końca.
-- : Jacek 'Szumak' Kotlarski : Stowarzyszenie OKSYWIE_NET : ::: < szumak at moja domena z nagłówka > : GG 2052377 ::: :::::::::: UWAGA: adres w nagłówku to SPAMTRAP ::::::::::
Paweł Matejski - 24-12-2006 00:38
Jacek 'Szumak' Kotlarski wrote: > Dnia Wed, 20 Dec 2006 17:26:00 +0100 osobie znanej jako hubert depesz > lubaczewski <depesz@depesz.com> przyszło do głowy napisać co następuje: > >> zmień strukturę danych. > > a jaką proponujesz? > > Dane z tej tablicy w aplikacji użytkownika prezentowane są w treectrl i > mają typową drzewiastą strukturę - w zasadzie nie ma większego problemu > gdy ładuję pełny rekordset z głównej tablicy, bo jestem w prosty sposób > w stanie uzyskać tablicę id rekordów wybranej gałęzi, schody zaczynają > się gdy zachodzi konieczność wczytania tylko jednej takiej gałęzi z > dużej bazy danych lub właśnie usunięcia tych rekordów bez konieczności > ładowania całości i tablicowania wybranych identyfikatorów. > Pomyślałem by zachowywać dla każdego rekordu dodatkowo identyfikator > jego root-rekordu co w prosty sposób rozwiązałoby pobieranie/kasowanie > całej gałęzi lecz nie jest to zadowalające rozwiązanie z uwagi na fakt, > że znacznie częściej będzie zachodziła konieczność pobrania/skasowania > tylko małego fragmentu gałęzi od wskazanego punktu do końca.
Jesteś blisko. FAQ, drzewa, metoda 5.
-- P.M.
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.plmorebeer.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 |
|