[SQL] SQL Server 2005의 계층 적 쿼리
SQLSQL Server 2005의 계층 적 쿼리
당연한 내가 오라클에서 일하는 웨이 다시 내가 CONNECT_BY했다 가게. 지금은 SQL 서버 2005 붙어 작업을하고있어 성가신 객체 계층 구조를 가지고있다. 모든 자식 레코드가 부모의 ID와 열이 어디 특히, 우리는 자기 참조 테이블이 있습니다. 현재 우리는 계층과 자녀와 연결 부모에게 무거운 짐을을하는 불쾌한 쿼리의 수준에 아이를 매핑하는 볼 수 있습니다. 이 방법은 작동하지만, 그것은 멀리 우아한에서하고 더러운의 냄새. 나는 다른 사람들이 SQL 서버 2005에서 계층 적 데이터를 검색하는 방법 그냥 궁금 해요.
해결법
-
==============================
1.이것은 당신의 전형적인 계층 테이블을 생성하고 계층 구조를 선택하고 각 항목에 대한 경로를 생성하기 위해 CTE를 사용합니다.
이것은 당신의 전형적인 계층 테이블을 생성하고 계층 구조를 선택하고 각 항목에 대한 경로를 생성하기 위해 CTE를 사용합니다.
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
산출:
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
-
==============================
2.둘 다 사용하는 데, 나는 CONNECT BY는 CTE의보다 사용하기 좀 더 유연하고 쉽게 발견했다. 하나 나는 몇 주 전에 대답에 질문은 비슷하지 않다. CTE의를 사용하여 쿼리의 예를 들어 CONNECT BY와 CTE의와 다음의 간단한 비교를 보려면 여기를 참조하십시오.
둘 다 사용하는 데, 나는 CONNECT BY는 CTE의보다 사용하기 좀 더 유연하고 쉽게 발견했다. 하나 나는 몇 주 전에 대답에 질문은 비슷하지 않다. CTE의를 사용하여 쿼리의 예를 들어 CONNECT BY와 CTE의와 다음의 간단한 비교를 보려면 여기를 참조하십시오.
-
==============================
3.그냥 참고하시기 바랍니다. SQL Server 2008을 지원하는 새로운 데이터 형식 계층 ID.
그냥 참고하시기 바랍니다. SQL Server 2008을 지원하는 새로운 데이터 형식 계층 ID.
-
==============================
4.이 읽기 :
이 읽기 :
http://www.sitepoint.com/article/hierarchical-data-database/2/
그것은 당신에게 몇 가지 아이디어를 제공해야합니다 ...
-
==============================
5.SQL Server 2005에서이 공통 테이블 식 (CTE)를 사용할 수 있습니다.
SQL Server 2005에서이 공통 테이블 식 (CTE)를 사용할 수 있습니다.
-
==============================
6.다음 형제 레벨을 먼저 계층 구조의 깊이를 탐색하기 위해, CTE를 사용할 수 있습니다 :
다음 형제 레벨을 먼저 계층 구조의 깊이를 탐색하기 위해, CTE를 사용할 수 있습니다 :
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)
from https://stackoverflow.com/questions/235515/hierarchical-queries-in-sql-server-2005 by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 쿼리 : 대신 하위 쿼리의 "AND"를 통해 여러 행 시뮬레이션 (0) | 2020.05.03 |
---|---|
[SQL] MySQL의 내부 쿼리 여러 테이블을 조인 (0) | 2020.05.03 |
[SQL] PBKDF2의 SQL 구현이 있습니까? (0) | 2020.05.03 |
[SQL] 두 개의 열을 사용하여 데이터의 피벗 (0) | 2020.05.03 |
[SQL] SQL 서버의 순열을 생성하는 가장 우아한 방법 (0) | 2020.05.03 |