0

これは私が作成したテーブルといくつかの初期値です。

/*Make the table*/

CREATE TABLE PEOPLE(
ID int PRIMARY KEY,
NAME varchar(100) NOT NULL,
SUPERIOR_NAME varchar(100)
);

/*Give it some initial values*/

INSERT INTO PEOPLE VALUES(1, 'A',NULL), (2, 'B', 'E'), (3, 'C', 'A'), 
(4, 'D', 'A'), (5, 'E',NULL), (6, 'F', 'D');

すべての部下などを含む、ある人のすべての部下を返す SQL プロシージャを作成する必要があります。この例では、A を入力すると、C、D、および F (A の部下である D の部下) を出力として取得する必要があります。しかし、C と D の 1 つのレベルまでしか取得できません。階層内の任意の数のレベルで機能させるにはどうすればよいですか? 私はそれを間違って見ていますか?

1つのレベルでそれを行うために私が書いた手順は次のとおりです。

USE DB
GO

CREATE PROCEDURE SP_GETSUBS @NAME VARCHAR(100)

AS
BEGIN

IF @NAME IN (SELECT SUPERIOR_NAME FROM PEOPLE)
SELECT SUPERIOR_NAME AS "NAME", NAME AS "SUBORDINATE" FROM PEOPLE WHERE
SUPERIOR_NAME=@NAME;     
END

最初のレベルの結果を一時テーブルにプッシュして再帰を使用することを考えていましたが、列のエントリを 1 つずつ実行する手順がわかりません。何か案は?SQL Server Management Studio 2012 を使用しています。

4

3 に答える 3

1

自己参照共通テーブル式を使用し、選択内容に最上位のマネージャー (Boss) を保持します。

WITH OrganisationChart (Id, [Name], [Level], superior_name, [Boss]) 
AS
(
      SELECT 
            Id, [Name], 0 AS [Level], superior_name, name
      FROM
            dbo.people
      WHERE
            superior_name IS NULL
      UNION ALL
      SELECT
            emp.Id,
            emp.[Name],
            [Level] + 1,
            emp.superior_name,
            [Boss]
      FROM
            dbo.people emp
      INNER JOIN 
            OrganisationChart 
      ON
            emp.superior_name = OrganisationChart.name

)
SELECT 
    * 
FROM 
    OrganisationChart
WHERE 
    name != [Boss]

Simon Inceの記事Hierarchies WITH Common Table Expressionsに感謝します。

于 2013-06-17T10:15:43.813 に答える