=?iso-8859-2?Q?=5Bmssql=5D_Zapytania_rekurencyjne__-_czy_sk=B3adnia_sql?==?iso-8859-2?Q?_co=B6_takiego_przewiduje_=3F?=
Filip Sielimowicz - 02-01-2006 12:07
=?iso-8859-2?Q?=5Bmssql=5D_Zapytania_rekurencyjne__-_czy_sk=B3adnia_sql?==?iso-8859-2?Q?_co=B6_takiego_przewiduje_=3F?=
Przykładowo: mamy w tabeli zapisane elementy drzewa/wielu drzew. Drzewo jest zapisane w tabeli w naturalnej, najprostszej postaci:
CREATE TABLE tree ( id integer, pid integer, CONSTRAINT pk_node PRIMARY KEY(id), CONSTRAINT fk_super_node FOREIGN KEY(pid) REFERENCES node(id) )
Zadanie: mamy dowolny element drzewa, mamy wyświetlić id korzenia'a tego drzewa. Rozwiązanie: standardy sql o ile wiem, nie przewidują operacji na strukturach rekurencyjnych, więc wykonanie zadania wymaga np. napisania procedury wbudowanej, która do rozwiązana problemu skorzysta z iteracji.
Natomiast w wielu bazach danych rozwiązano ten problem wychodząc poza standardy sql'a.
W ibm db2 do tego celu wykorzystuje się konstrukcję łączącą with(tworzenie tabeli tymczasowej) i union all(łączenie tabeli tymczasowej samej ze sobą):
with rr (id,pid) as ( select tr.id, tr.pid from tree tr where tr.id=1 union all select tt.id,tt.pid from tree tt, rr where tt.id = rr.pid ) select id from rr where rr.pid is null
W Oracle do zapytań rekurencyjnych, o ile sięorientuję, wykorzystuje się konstrukcje start with ... connect by.
Czy mssql oferuje coś podobnego ?
Filip Sielimowicz - 02-01-2006 12:07
=?iso-8859-2?Q?Re:_=5Bmssql=5D_Zapytania_rekurencyjne__-_czy_sk=B3adnia?==?iso-8859-2?Q?_sql_co=B6_takiego_przewiduje_=3F?= Użytkownik "Filip Sielimowicz" <sielim@poczta.onet.pl> napisał w wiadomości news:dp9ahu$qt7$1@news.onet.pl...
> with > rr (id,pid) as ( > select tr.id, tr.pid from tree tr where tr.id=1 > union all > select tt.id,tt.pid from tree tt, rr > where tt.id = rr.pid > ) > select id from rr where rr.pid is null > > W Oracle do zapytań rekurencyjnych, o ile sięorientuję, > wykorzystuje się konstrukcje start with ... connect by. > > Czy mssql oferuje coś podobnego ?
Rzut oka na http://www.sqlservercentral.com/colu...server2005.asp mówi mi, że w mssql'u jest podobnie jak w db2, w dodatku zdaje się, że jest to już zapisane w standardzie ISO SQL:1999.
keczerad - 02-01-2006 12:07
=?ISO-8859-2?Q?Re=3A_=5Bmssql=5D_Zapytania_rekurencyjne_?==?I SO-8859-2?Q?_-_czy_sk=B3adnia_sql_co=B6_takiego_przewid?==?ISO-8859-2?Q?uje_=3F?=
Filip Sielimowicz napisał(a): > Czy mssql oferuje coś podobnego ?
kursory = petla w TSQL
--
keczerad
http://www.e-mo.com.pl sklep w (X)HTML
keczerad - 02-01-2006 12:07
=?ISO-8859-2?Q?Re=3A_=5Bmssql=5D_Zapytania_rekurencyjne_?==?I SO-8859-2?Q?_-_czy_sk=B3adnia_sql_co=B6_takiego_przewid?==?ISO-8859-2?Q?uje_=3F?=
keczerad napisał(a): > Filip Sielimowicz napisał(a): > >> Czy mssql oferuje coś podobnego ? > > > > kursory = petla w TSQL >
bodajze w MSSQL 2005 rekurencja jest wbudowana, ale tego nie jestem pewien.
--
keczerad
http://www.e-mo.com.pl sklep w (X)HTML
Artur Muszynski - 02-01-2006 12:07
> kursory = petla w TSQL
Odczep się od kursorów. Pytający umie to rozwiązać za pomocą pętli i imho najlepiej opakować to w funkcję i wystarczy. SELECT id,dbo.root(@id) FROM t
artur
> > -- > > keczerad > > http://www.e-mo.com.pl > sklep w (X)HTML
keczerad - 02-01-2006 12:07
=?ISO-8859-2?Q?Re=3A_=5Bmssql=5D_Zapytania_rekurencyjne_?==?I SO-8859-2?Q?_-_czy_sk=B3adnia_sql_co=B6_takiego_przewid?==?ISO-8859-2?Q?uje_=3F?=
Artur Muszynski napisał(a): > > > Odczep się od kursorów. Pytający umie to rozwiązać za pomocą pętli i imho > najlepiej opakować to w funkcję i wystarczy. > SELECT id,dbo.root(@id) FROM t >
wg mnie nie da sie tego zrobic w funkcji bez kursora, rekurencja to cos co znajdzie odpowiedz w 1,2,3 ... n iteracjach wiec zwyklym zapytaniem bez kursora tego nie zrobisz.
--
keczerad
http://www.e-mo.com.pl sklep w (X)HTML
Vez do Han - 02-01-2006 12:07
=?iso-8859-2?Q?Re:_=5Bmssql=5D_Zapytania_rekurencyjne__-_czy_sk=B3adnia?==?iso-8859-2?Q?_sql_co=B6_takiego_przewiduje_=3F?=
Użytkownik "keczerad" <keczerad@poczta.fm> napisał w wiadomości news:dp9nuf$k2c$1@atlantis.news.tpi.pl... > Artur Muszynski napisał(a): > > > > > > Odczep się od kursorów. Pytający umie to rozwiązać za pomocą pętli i imho > > najlepiej opakować to w funkcję i wystarczy. > > SELECT id,dbo.root(@id) FROM t > > > > wg mnie nie da sie tego zrobic w funkcji bez kursora, rekurencja to cos > co znajdzie odpowiedz w 1,2,3 ... n iteracjach wiec zwyklym zapytaniem > bez kursora tego nie zrobisz. >
Noo, bez kursora, w pętli while (no jescze tabelka z # mi się pojawi) zrobię.
szaman - 02-01-2006 12:07
> >bodajze w MSSQL 2005 rekurencja jest wbudowana, ale tego nie jestem pewien.
Zgadza się.
http://www.sqlservercentral.com/colu...server2005.asp -- {67B14976-ABB4-4A3B-869B-84B5CCA1F569}
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[oracle] - Oracle SQL Developer - co to jest SID?
MS Sql Server 2000 i Server 2003
[MS SQL + kontakty outlook]CZy kontakty moge być zewnętrzne?
[oracle] Baza danych do kursy Introduction to Oracle9i:PL/SQL ? Skąd ją pobrać ?
ms sql 2000 i ms server 2003 problem z logowaniem
[MS SQL 2000] - wielkosc strony danych a wielkosc klastra dyskowego
mecze sie i mecze i nic - zapytanie czesciowe
[MS SQL 2005] =?windows-1250?Q?Ilo=9C=E6_wiersz=F3w_w_zbiorze_wynikowym?=
[ms sql] Przeniesienie bazy z wszystkimi dodatkami (dts, jobs, replikacja) na inny server ?
konkurs SQL Injection - 10 PLN na GSM dla pierwszej osoby, ktora dostanie sie do bazy
zanotowane.pldoc.pisz.plpdf.pisz.pllunadance.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 |
|