Dawno temu, gdy pracowałem w sklepie Oracle, wziąłem CONNECT_BY za pewnik. Teraz utknąłem pracy z SQL Server 2005 i mają pewne nieprzyjemne hierarchie obiektów. W szczególności mamy tabelę samo-odwołującą się, w której wszystkie rekordy podrzędne mają kolumnę z identyfikatorem rodzica. Obecnie mamy widok, który odwzorowuje dzieci na poziomy w hierarchii i nieprzyjemne zapytanie, które robi ciężki lifting, aby połączyć rodziców z dziećmi. Chociaż ta metoda działa, jest ona daleka od elegancji i zapachu skażenia. Jestem tylko ciekawy, jak inni ludzie pobierają hierarchiczne dane z SQL Server 2005.Hierarchiczne zapytania w SQL Server 2005
Odpowiedz
w SQL Server 2005 można użyć do tego celu wspólnych wyrażeń tabelarycznych (CTE).
Spowoduje to utworzenie typowej tabeli hierarchicznej i użycie CTE do wybrania struktury hierarchii i utworzenia ścieżki dla każdego elementu.
CREATE TABLE tblHierarchy (ID int, ParentID int NULL, Name varchar(128));
INSERT INTO tblHierarchy VALUES (1, NULL, '1');
INSERT INTO tblHierarchy VALUES (2, NULL, '2');
INSERT INTO tblHierarchy VALUES (3, NULL, '3');
INSERT INTO tblHierarchy VALUES (4, 1, '1.1');
INSERT INTO tblHierarchy VALUES (5, 1, '1.2');
INSERT INTO tblHierarchy VALUES (6, 4, '1.1.1');
WITH Parent AS
(
SELECT
ID,
ParentID,
Name AS Path
FROM
tblHierarchy
WHERE
ParentID IS NULL
UNION ALL
SELECT
TH.ID,
TH.ParentID,
CONVERT(varchar(128), Parent.Path + '/' + TH.Name) AS Path
FROM
tblHierarchy TH
INNER JOIN
Parent
ON
Parent.ID = TH.ParentID
)
SELECT * FROM Parent
WYJŚCIE:
ID ParentID Path
1 NULL 1
2 NULL 2
3 NULL 3
4 1 1/1.1
5 1 1/1.2
6 4 1/1.1/1.1.1
Wystarczy FYI. SQL Server 2008 obsługuje nowy typ danych: Hierarchy ID.
Przeczytaj to:
http://www.sitepoint.com/article/hierarchical-data-database/2/
Należy podać kilka pomysłów ...
Tak, zestawy zagnieżdżone są zdecydowanie drogą do uzyskania nieograniczonej hierarchii w RDBMS. Opis Sitepoint sprawia, że brzmi to nieco bardziej skomplikowanie, niż jest w rzeczywistości, a implementacje można uprościć, np. przez "kolejność rangi" i "rangę następnego rodzeństwa" zamiast "lewej" i "prawej". – bobince
Po stosować zarówno znalazłem CONNECT BY jest nieco bardziej elastyczne i łatwiejsze w użyciu niż CTE jest. Pytanie nie różni się od tego, na które odpowiedziałem kilka tygodni temu. Zobacz artykuł Here, gdzie znajduje się krótkie porównanie instrukcji CONNECT BY i CTE oraz Here, aby uzyskać przykład zapytania za pomocą CTE.
Przyjemność, że CONNECT BY nie istnieje w MSSQL. –
przemierzać głębokości Hierarchii pierwszy potem następny poziom rodzeństwo, CTE można stosować:
declare @tempTable TABLE
(
ORGUID int,
ORGNAME nvarchar(100),
PARENTORGUID int,
ORGPATH nvarchar(max)
)
;WITH RECORG(ORGuid, ORGNAME, PARENTORGUID, ORGPATH)
as
(
select
org.UID,
org.Name,
org.ParentOrganizationUID,
dbo.fGetOrganizationBreadcrumbs(org.UID)
from Organization org
where org.UID =1
union all
select
orgRec.UID,
orgRec.Name,
orgRec.ParentOrganizationUID,
dbo.fGetOrganizationBreadcrumbs(orgRec.UID)
from Organization orgRec
inner join RECORG recOrg on orgRec.ParentOrganizationUID = recOrg.ORGuid
)
insert into @tempTable(ORGUID, ORGNAME, PARENTORGUID,ORGPATH)
select ORGUID, ORGNAME, PARENTORGUID,ORGPATH
from RECORG rec
select *
from @tempTable where ORGUID in(select MIN(tt.ORGUID)
from @tempTable tt
group by tt.PARENTORGUID)
- 1. Hierarchiczne zapytania w MySQL
- 2. SQL Server 2005: Deadlock transakcji
- 3. SQL Server 2005 Datownik Data Zapytanie
- 4. Potrzebuję powolnego zapytania w AdventureWorks (SQL 2005)
- 5. zapytania SQL Server error
- 6. Jak dołączyć do pola tekstowego w SQL Server 2005 SQL Server 2005
- 7. dołączyć trzy tabele w SQL Server 2005
- 8. Jak zdefiniować ENUM w SQL Server 2005?
- 9. Łączy ntext w programie SQL Server 2005
- 10. Pomiń pierwszy wiersz w SQL Server 2005?
- 11. Zakres o CTE w SQL Server 2005
- 12. SQL Server 2005: Określ typ danych zmiennej
- 13. Sql server Integration Services kompatybilność 2008-2005
- 14. SQL Server 2005: Dlaczego transakcje nazw?
- 15. SQL Server 2005: zerowalny klucz obcy
- 16. SQL Server 2005 implementacja MySQL REPLACE INTO?
- 17. Obliczona kolumna SQL Server 2005 jest utajniona
- 18. SQL Server 2005 ORDER BY z wyrazem
- 19. Kwartalne miesięczne zapytania SQL Server
- 20. Zapytanie Active Directory z SQL Server 2005
- 21. SQL Server 2005 - Sprawdź wartość zerową DateTime
- 22. SQL Server 2005 - usuwanie wyzwalaczy tabel?
- 23. SQL Server 2005: Jak odjąć 6 miesięcy
- 24. Wymuszenie limitu czasu zapytania w SQL Server
- 25. Jak wyczyścić dół Statystyki wykonania zapytania w SQL Server 2005/2008
- 26. SQL Server 2005: T-SQL do tymczasowego wyłączenia wyzwalacza
- 27. Wyszukiwanie tekstów w procedurach zapisanych w SQL Server 2005
- 28. SQL Server 2005 - Zbadaj, co spowodowało ogromny wzrost temperatury tempdb
- 29. Hierarchiczne dane w Linq - opcje i wydajność
- 30. Replikacja SQL Server 2005 i różne indeksy subskrybenta
siła rekurencyjna jest with() ty. har har har. –
Czy możesz pokazać przykład? –