2009-11-15 3 views
2

J'ai une table de nom de l'organisation avec la structure suivante donnée ci-dessous:Vue parent-enfant à partir d'une table auto-référencée (ID)? (. Pour les gourous TSQL)

CREATE TABLE [dbo].[DP_ORG_OrganizationUnit](
    [GID] [uniqueidentifier] NULL, 
    [ID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL, 
    [Code] [nvarchar](100) NULL, 
    [Name] [nvarchar](100) NULL, 
    [LastUpdated] [datetime] NULL, 
    [ManagedBy] [int] NULL, **SELF REFERENCING ID {For parent - child }*** 
    [Manager] [int] NULL, 
CONSTRAINT [PK_DP_ORG_OrganizationUnit] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

exigence est que je dois créer une vue qui va me donner un chemin complet pour chaque organisation unité.

ID CODE NAME     MANAGEDBY MANAGER 
1 HO Head Office    0 
2 IT Information Technology 1 
3. FI Finance     1 
4. SP IT Support    2 
5. M  Mergers     3 

J'ai besoin les données à venir comme

1. Head Office 
2. Head Office/Information Technology 
3. Head Office/Finance 
4. Head Office/Information Technology/IT Support 
5. Head Office/Finance/Mergers 

Je veux tirer directement cela en une forme de critères d'un rapport afin que le peut sélectionner les sous-services d'un seul combo! Comment puis-je obtenir cela de TSQL (ms sql 2005). Merci d'avance pour toute solution.

Solution # 1:

with cteAnchor as (
select ID,CAST(Name as nvarchar(500)) as Name 
from DP_ORG_OrganizationUnit 
where ManagedBy = 21) 
, cteRecursive as 
(select ID,CAST(Name as nvarchar(500))as Name 
    from cteAnchor 
union all 
select t.ID,CAST(r.Name + '/' + t.Name AS nvarchar(500)) 
from DP_ORG_OrganizationUnit t 
join cteRecursive r on t.ManagedBy = r.ID) 
select * from cteRecursive; 

Répondre

5

Voir récursive Queries Using Common Table Expressions:

with cteAnchor as (
select Name, id 
from DP_ORG_OrganizationUnit 
where ManagedBy = 0) 
, cteRecursive as (
select id, Name 
    from cteAnchor 
union all 
select t.id, r.Name + '/' + t.Name 
from DP_ORG_OrganizationUnit t 
join cteRecursive r on t.ManagedBy = r.id) 
select * from cteRecursive; 
+0

i sorta obtenir l'image – abmv

+0

@Remus - C'est SOOOOO cool! J'ai toujours dû gérer le tri et l'affichage, etc. au niveau de l'application. Merci un million! –

Questions connexes