2010-02-10 29 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. 

等。

非反演选择看起来像THI(我用的SqlServer 2008)S:

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(非倒置)树的查询吗?你使用的是哪个数据库?做一个谷歌搜索递归查询,虽然技术不同数据库之间。 – FrustratedWithFormsDesigner 2010-02-10 14:32:54

+0

我编辑了帖子并发布了原始查询 – Vytas999 2010-02-10 15:20:58

+0

如果您从原始查询中删除不重要的字段,这可能会有所帮助。它会澄清你从哪里获得1,1.1,1.1等。 – 2010-02-11 14:28:12

回答

1

如果你不能做递归那么我只能想到一个其他的解决办法。我相信这不是最佳的,但。你可以做上面你正在做的事情,并将这些数据插入到一个临时表中,并有两个额外的列。一列将保存你的父母ID,因为它似乎仍然是在最高级别上按降序排列(因为你在2之前拥有全部1),而另一列可能只是持有种子标识整数。然后,您可以查询该表并按升序对原始父ID(第一个数字)进行排序,然后按降序对种子ID进行排序。从我收集的信息可以发现,但效率不高。