2010-02-10 7 views
3

안녕하세요, 저는 SQL에서 트리 구조를 가지고 있습니다. 논리는 표준입니다 : SomeID, ParentID, 다른 필드. 이 같은 데이터를 선택하는 선택 절차가 있습니다 등등SQL 반전 트리 선택

1. 
1.1 
1.1.1 

하고 있습니다. 그래서

1.1.1. 
1.1. 
1. 
2.2.2.2.2. 
2.2.2.2. 
2.2.2. 
2.2. 
2. 

를 실행 한 다음과 같이 - 반전 된 결과를 얻을 수, 선택 프로 시저를 작성하는 방법

은 (루트 가지 먼저 가장 깊은 지점, 마지막 선택). 생 (내가 SQLSERVER 2008을 사용)의 같은

비 inversive 선택 외모 : 당신이 재귀를 할 수없는 경우

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[Object_SelectDownByRoot] 
@ObjectID int 

AS 
WITH tree (ObjectID, ParentID, ObjectName, ObjectCode, DistrictID, DistrictName, 
         CityName, RegionName, StreetName, StreetID, AddressID, ObjectTypeName, 
         RouteName, ObjectTypeID, RouteID, AvrgTempIn, Area, Volume, 
         ElectricPower, ObjectStatusName, ObjectStatusID, [ControlRoom?], DateBuild, 
         [Floor], EncloseName, EncloseID, MaintenanceEval, AdministratorID, 
         Administrator, ElectricityPerson, ElectricityPersonID, 
         HeatingPersonID, HeatingPerson, HouseNo, FlatNo, ZIP, 
         AddressStreet, RouteCode, RouteDescription, 
         AddressDescription, StreetID2, CityID, AddressCityName) AS 
    (
     SELECT 
     ObjectID, ParentID, ObjectName, ObjectCode, DistrictID, DistrictName, 
          CityName, RegionName, StreetName, StreetID, AddressID, ObjectTypeName, 
          RouteName, ObjectTypeID, RouteID, AvrgTempIn, Area, Volume, 
          ElectricPower, ObjectStatusName, ObjectStatusID, [ControlRoom?], DateBuild, 
          [Floor], EncloseName, EncloseID, MaintenanceEval, AdministratorID, 
          Administrator, ElectricityPerson, ElectricityPersonID, 
          HeatingPersonID, HeatingPerson, HouseNo, FlatNo, ZIP, 
          AddressStreet, RouteCode, RouteDescription, 
          AddressDescription, StreetID2, CityID, AddressCityName 
     FROM dbo.[ObjectQ] ofs 
     WHERE(ObjectID = @ObjectID) 

     UNION ALL 

     SELECT  ofs.ObjectID, ofs.ParentID, ofs.ObjectName, ofs.ObjectCode, ofs.DistrictID, ofs.DistrictName, 
          ofs.CityName, ofs.RegionName, ofs.StreetName, ofs.StreetID, ofs.AddressID, ofs.ObjectTypeName, 
          ofs.RouteName, ofs.ObjectTypeID, ofs.RouteID, ofs.AvrgTempIn, ofs.Area, ofs.Volume, 
          ofs.ElectricPower, ofs.ObjectStatusName, ofs.ObjectStatusID, ofs.[ControlRoom?], ofs.DateBuild, 
          ofs.[Floor], ofs.EncloseName, ofs.EncloseID, ofs.MaintenanceEval, ofs.AdministratorID, 
          ofs.Administrator, ofs.ElectricityPerson, ofs.ElectricityPersonID, 
          ofs.HeatingPersonID, ofs.HeatingPerson, ofs.HouseNo, ofs.FlatNo, ofs.ZIP, 
          ofs.AddressStreet, ofs.RouteCode, ofs.RouteDescription, 
          ofs.AddressDescription, ofs.StreetID2, ofs.CityID, ofs.AddressCityName 
      FROM dbo.[ObjectQ] ofs 
      JOIN tree ON tree.ObjectID = ofs.ParentID 
    ) 

    SELECT 
    ObjectID, ParentID, ObjectName, ObjectCode, DistrictID, DistrictName, 
         CityName, RegionName, StreetName, StreetID, AddressID, ObjectTypeName, 
         RouteName, ObjectTypeID, RouteID, AvrgTempIn, Area, Volume, 
         ElectricPower, ObjectStatusName, ObjectStatusID, [ControlRoom?], DateBuild, 
         [Floor], EncloseName, EncloseID, MaintenanceEval, AdministratorID, 
         Administrator, ElectricityPerson, ElectricityPersonID, 
         HeatingPersonID, HeatingPerson, HouseNo, FlatNo, ZIP, 
         AddressStreet, RouteCode, RouteDescription, 
         AddressDescription, StreetID2, CityID, AddressCityName 
    FROM tree 
+2

regualar (비역) 트리를 선택하는 데 사용하는 쿼리를 게시 할 수 있습니까? 어떤 데이터베이스를 사용하고 있습니까? 기술은 데이터베이스마다 다르지만 재귀 쿼리에 대해 Google 검색을 수행하십시오. – FrustratedWithFormsDesigner

+0

게시물을 편집하여 원래 쿼리를 게시했습니다. – Vytas999

+0

원래 쿼리에서 중요하지 않은 필드를 제거하면 도움이 될 수 있습니다. 그것은 당신이 1, 1.1, 1.1.1 등을 어디에서 얻고 있는지 명확히 할 것입니다. –

답변

1

나는 단 하나 개의 다른 솔루션을 생각할 수 있습니다. 나는 그것이 최적이 아니라고 확신하지만. 위에서 수행중인 작업을 수행하고 2 개의 추가 열이있는 임시 테이블에 해당 데이터를 삽입 할 수 있습니다. 하나의 열은 가장 높은 수준에서 내림차순으로 정렬하는 것처럼 보이며 (다른 모든 것보다 1이 모두 있기 때문에) 부모가 시드 ID 정수를 보유 할 수 있으므로 부모 ID를 보유하게됩니다. 그런 다음 테이블을 쿼리하고 원래 부모 ID (첫 번째 숫자)를 오름차순으로 정렬 한 다음 시드 된 Identity 정수를 내림차순으로 정렬 할 수 있습니다. 내가 모은 것에서는 효과가 있지만 비효율적 일 것입니다.