ďťż
 
[SQLite3] zapytanie rekurencyjne ďťż
 
[SQLite3] zapytanie rekurencyjne
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

[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.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
  • morebeer.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com