Jaki jest najprostszy sposób wykonania rekursywnego samosprzężenia w SQL Server? Mam taki stół:
PersonID | Initials | ParentID
1 CJ NULL
2 EB 1
3 MB 1
4 SW 2
5 YT NULL
6 IS 5
Chcę mieć możliwość uzyskania rekordów związanych tylko z hierarchią zaczynającą się od określonej osoby. Więc gdybym poprosił o hierarchię CJ przez PersonID = 1, uzyskałbym:
PersonID | Initials | ParentID
1 CJ NULL
2 EB 1
3 MB 1
4 SW 2
A dla EB dostałbym:
PersonID | Initials | ParentID
2 EB 1
4 SW 2
Trochę utknąłem w tym, nie mogę pomyśleć, jak to zrobić poza odpowiedzią o stałej głębi opartą na kilku połączeniach. Zrobiłoby to tak, jak to się dzieje, ponieważ nie będziemy mieć wielu poziomów, ale chciałbym to zrobić poprawnie.
Dzięki! Chris.
Odpowiedzi:
Dodając warunek zamówienia, możesz zachować kolejność drzew:
Zmieniając
ORDER BY
warunek, możesz zmienić kolejność rodzeństwa.źródło
PersonID = theIdYouAreLookingFor
zamiastParentID IS NULL
.WITH
klauzuli. Jeśli potrzebujesz szczegółowych informacji, utwórz skrzypce na sqlfiddle.com i umieść łącze tutaj.Używając CTE możesz to zrobić w ten sposób
źródło
Zapytanie Quassnoi ze zmianą dla dużej tabeli. Rodzice z większą liczbą dzieci niż 10: Formatowanie jako str (5) row_number ()
źródło
SQL 2005 lub nowszy, CTE są standardowym sposobem postępowania zgodnie z przedstawionymi przykładami.
SQL 2000, możesz to zrobić za pomocą funkcji UDF -
(który zadziała w 2005 r., ale nie jest to standardowy sposób. To powiedziawszy, jeśli uznasz, że jest to łatwiejszy sposób na pracę, biegnij z nim)
Jeśli naprawdę musisz to zrobić w SQL7, możesz zrobić to z grubsza w sproc, ale nie możesz z tego wybrać - SQL7 nie obsługuje UDF.
źródło
Zapoznaj się z poniższymi informacjami, aby lepiej zrozumieć koncepcję rekursji CTE
źródło