Czy istnieje sposób na przeglądanie danych drzewa w SQL? Wiem o tym connect by
w Oracle, ale czy istnieje inny sposób, aby to zrobić w innych implementacjach SQL? Pytam, ponieważ używanie connect by
jest ł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_id
podobne 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 by
nie 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.
źródło
Odpowiedzi:
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”.
źródło
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ć
HIERARCHYID
typu danych. Dobry przykład można znaleźć na stronie HierarchyID: Modeluj swoje hierarchie danych za pomocą SQL Server 2008Dodatkowe zasoby:
źródło
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.
źródło
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
ltree
zapewnia również inny zestaw zalet i wad implementacji.Więcej informacji na tej stronie można znaleźć, przeszukując tag hierarchii .
źródło