2011-10-17 14 views
0

私はエージェントテーブルと階層テーブルを持っています。下のトップアプローチからの共通テーブル式

CREATE TABLE [dbo].[Agent](
[AgentID] [int] IDENTITY(1,1) NOT NULL, 
[FirstName] [varchar](50) NULL, 
[LastName] [varchar](50) NULL, 
CONSTRAINT [PK_Agent] PRIMARY KEY CLUSTERED 
(
    [AgentID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

CREATE TABLE [dbo].[Hierarchy](
    [HierarchyID] [int] IDENTITY(1,1) NOT NULL, 
    [AgentID] [int] NULL, 
    [NextAgentID] [int] NULL, 
CONSTRAINT [PK_Hierarchy] PRIMARY KEY CLUSTERED 
(
    [HierarchyID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

--insert --insert

INSERT INTO [Agent]([FirstName],[LastName])VALUES('C1','C1'); 
INSERT INTO [Agent]([FirstName],[LastName])VALUES('C2','C2'); 
INSERT INTO [Agent]([FirstName],[LastName])VALUES('C3','C3'); 
INSERT INTO [Agent]([FirstName],[LastName])VALUES('C4','C4'); 

SELECT * FROM Agent; 
AgentID FirstName LastName 
1  C1  C1 
2  C2  C2 
3  C3  C3 
4  C4  C4 
エージェントへ

INSERT INTO [Hierarchy] ([AgentID],[NextAgentID]) VALUES (1,NULL); 
INSERT INTO [Hierarchy] ([AgentID],[NextAgentID]) VALUES (2,1); 
INSERT INTO [Hierarchy] ([AgentID],[NextAgentID]) VALUES (3,2); 
INSERT INTO [Hierarchy] ([AgentID],[NextAgentID]) VALUES (2,4); 
INSERT INTO [Hierarchy] ([AgentID],[NextAgentID]) VALUES (4,NULL); 

SELECT * FROM Hierarchy; 
HierarchyID AgentID NextAgentID 
1  1 NULL 
2  2 1 
3  3 2 
4  2 4 
5  4 NULL 

を階層に私はトップレベル

WITH AgentHierarchy(AgentID, NextAgentID, HierarchyLevel) 
AS 
(
    SELECT 
     H1.AgentID, 
     H1.NextAgentID, 
     1 HierarchyLevel 
    FROM Hierarchy H1 
    WHERE NOT EXISTS (SELECT 1 FROM Hierarchy H2 WHERE H2.NextAgentID = H1.AgentID) 
    UNION ALL 
    SELECT 
     H.AgentID, 
     H.NextAgentID, 
     (AgentHierarchy.HierarchyLevel + 1) HierarchyLevel 
    FROM Hierarchy H  
    INNER JOIN AgentHierarchy ON AgentHierarchy.NextAgentID = H.AgentID 
) 
SELECT DISTINCT 
    AgentID, 
    NextAgentID, 
    HierarchyLevel 
FROM AgentHierarchy 
ORDER BY AgentID, NextAgentID, HierarchyLevel; 
に底を決定するために、共通テーブル式を使用

結果:

AgentID NextAgentID HierarchyLevel 
1  NULL  3 
2  1   2 
3  2   1 
4  NULL  1 
2  4   1 

私の要件は、これは以下のように示すことである。要するに

AgentID NextAgentID HierarchyLevel 
1  NULL  1 
2  1   1 
3  2   1 
3  1   2 
4  NULL  1 
2  4   1 
3  4   2 

、レベルの再帰すべての階層が下から上へのアプローチで引っ張らなければなりません。 ...

答えて

0

を助けてください、私は答えを見つけた:

WITH AgentHierarchy(AgentID, NextAgentID, HierarchyLevel) 
AS 
(
    SELECT 
     H1.AgentID, 
     H1.NextAgentID, 
     1 HierarchyLevel 
    FROM Hierarchy H1 
    --WHERE NOT EXISTS (SELECT 1 FROM Hierarchy H2 WHERE H2.NextAgentID = H1.AgentID) 
    UNION ALL 
    SELECT 
     AgentHierarchy.AgentID, 
     H.NextAgentID, 
     (AgentHierarchy.HierarchyLevel + 1) HierarchyLevel 
    FROM Hierarchy H  
    INNER JOIN AgentHierarchy ON AgentHierarchy.NextAgentID = H.AgentID 
) 
SELECT 
    AgentHierarchy.AgentID, 
    NextAgentID, 
    HierarchyLevel 
FROM AgentHierarchy 
WHERE NOT (NextAgentID IS NULL AND HierarchyLevel > 1); 

私は次のように変更しました:

  1. はアンカークエリWHERE句を削除します。
  2. UNIONの後にセカンドセレクトにCTEのAgentIDを追加しました。
  3. 最下位レベルのジャンクレコードをNULL NextAgentIDで削除するために、CTEにWHERE句を追加しました。

質問がある場合は教えてください。

+0

あなたの答えは受け入れられているとマークして、未回答の質問リストから削除してください。これは、あなたの答えの横のチェックをクリックすることによって行うことができます。 –

関連する問題