2010-02-10 6 views
3

Bonjour, j'ai la structure en arbre en sql. La logique est standard: SomeID, ParentID, autres champs. Je procédure de sélection, qui sélectionne des données comme ceci:SQL sélectionner arbre inversé

1. 
1.1 
1.1.1 

et ainsi de suite.

Comment écrire la procédure de sélection, pour obtenir le résultat inversé (premier sont sélectionnés les branches les plus profondes, dernière - branches de racines), comme ceci:

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

et ainsi de suite.

Non inversif sélectionnez ressemble thi (j'utilise 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

Pourriez-vous publier la requête que vous utilisez pour sélectionner l'arborescence regualar (non-inversée)? Quelle base de données utilisez-vous? Faites une recherche google sur les requêtes récursives, bien que les techniques varient entre les bases de données. – FrustratedWithFormsDesigner

+0

J'ai modifié le message et posté la requête d'origine – Vytas999

+0

Il peut être utile si vous supprimez les champs sans importance de la requête d'origine. Cela clarifierait où vous obtenez le 1, 1.1, 1.1.1, etc. –

Répondre

1

Si vous ne pouvez pas faire alors récursion je ne peux penser à une autre solution. Je suis sûr que ce n'est pas optimal mais. Vous pouvez faire ce que vous faites ci-dessus et insérer ces données dans une table temporaire avec 2 colonnes supplémentaires. La colonne contiendrait votre identifiant parent, car il semble que vous êtes encore en train de trier par ordre décroissant au niveau le plus élevé (puisque vous avez tous les 1 avant tous les 2) et l'autre pourrait contenir un entier Identité ensemencé. Ensuite, vous pouvez simplement interroger la table et trier sur l'ID parent d'origine (le tout premier nombre) dans l'ordre croissant, puis l'entier Identité ensemencée dans l'ordre décroissant. D'après ce que je comprends, cela fonctionnerait mais ce serait inefficace.