Przechodzenie danych podobnych do drzewa w relacyjnej bazie danych za pomocą SQL

16

Czy istnieje sposób na przeglądanie danych drzewa w SQL? Wiem o tym connect byw Oracle, ale czy istnieje inny sposób, aby to zrobić w innych implementacjach SQL? Pytam, ponieważ używanie connect byjest łatwiejsze niż pisanie pętli lub funkcji rekurencyjnej w celu uruchomienia zapytania dla każdego wyniku.

Ponieważ niektórzy ludzie zdają się być zdezorientowani zwrotem „dane drzewa”, wyjaśnię dalej: Mam na myśli tabele, które mają parent_idpodobne pole zawierające klucz podstawowy z innego wiersza w tej samej tabeli.

Pytanie pochodzi z doświadczenia, w którym pracowałem z danymi przechowywanymi w ten sposób w bazie danych Oracle i wiedziałem, że connect bynie są one zaimplementowane w innych DBMS. Gdyby użyć standardowego SQL-a, należałoby stworzyć nowy alias tabeli dla każdego rodzica, którego chciałoby się zwiększyć. To może łatwo wymknąć się spod kontroli.

indyk1ng
źródło
Masz rozwiązania Joe Celko. Kilka próbek: Drzewa w SQL , Drzewa i Hierarchie w Oracle , Zagnieżdżony model zestawu . Cukier składniowy nie jest konieczny ;-).
Marian

Odpowiedzi:

14

Książka Celko jest dobrym zasobem - czasem nieco zbyt „akademickim”.

Naprawdę znalazłem też, że ta metoda , zwana „tabelami zamknięcia”, działa dość dobrze.

Jeśli korzystasz z bazy danych, która pozwala na rekurencyjne CTE (takie jak PostgreSQL 8.4 lub nowszy lub SQL Server 2005 lub nowszy ), to naprawdę najlepsza droga. Jeśli korzystasz z Oracle, zawsze jest czcigodny „Połącz przez” .

Z mojego doświadczenia wynika, że ​​znacznie częściej przekazuje się zestaw tabel w schemacie „naiwnego drzewa” i muszę wymyślić, jak wyodrębnić właściwe drzewo z tego magazynu, niż mieć możliwość stworzenia sprzątaczki struktura „tabel zamknięcia”.

TML
źródło
9

Rekurencyjne CTE będzie twoim najłatwiejszym rozwiązaniem. SQL Server 2005 i aktualne wersje PostgreSQL obsługują CTE. Jeśli używasz programu SQL Server 2008 lub nowszego, możesz użyć HIERARCHYIDtypu danych. Dobry przykład można znaleźć na stronie HierarchyID: Modeluj swoje hierarchie danych za pomocą SQL Server 2008

Dodatkowe zasoby:

Jeremiasz Peschka
źródło
5

W SQL Server (wersje 2005 i nowsze) możesz używać wspólnych wyrażeń tabelowych do odczytu hierarchii, zobacz Microsoft SQL Server 2005 - CTE Przykład prostej hierarchii dla kilku przykładów.

Joe Celko polecił mi bardziej ogólnie książkę na ten temat, którą jest „Drzewa i hierarchie w SQL for Smarties” - chociaż ja tak naprawdę nie oglądałem tej książki.

David Spillett
źródło
1

Standardowa metoda SQL to „zapytanie rekurencyjne”, które jest dostarczane przez rekurencyjne CTE i oznaczone jak WITH [ RECURSIVE ]w zapytaniu. Implementacja nie jest określona w specyfikacji, tylko metody udostępnione dla struktur zapytań, które są rekurencyjne. W najprostszym przypadku implementacja struktury danych wymaga tylko identyfikatora i identyfikatora rodzica w wierszu.

Istnieje również wiele rozwiązań specyficznych dla RDBMS: na przykład PostgreSQL obsługuje rekurencyjne CTE, ale ltreezapewnia również inny zestaw zalet i wad implementacji.

Więcej informacji na tej stronie można znaleźć, przeszukując tag .

Evan Carroll
źródło