sql >> データベース >  >> RDS >> Sqlserver

親 ID に基づいてすべてのデータを再帰的に取得する

    これは、共通テーブル式 (CTE) を使用して、SQL Server 2005 以降で実行できます。再帰クエリについて説明している MSDN のリンクは次のとおりです。

    以下に例を示します:

    人々の階層的な線を想像すると、このクエリを使用すると、すべての人の完全な線を表示し、階層内の位置を計算できます。子関係を見つけるように変更できます。

    個人の ID の代わりに、親として使用している行の ID を交換します。

    --Create table of dummy data
    create table #person (
    personID integer IDENTITY(1,1) NOT NULL,
    name      varchar(255) not null,
    dob       date,
    father    integer
    );
    
    INSERT INTO #person(name,dob,father)Values('Pops','1900/1/1',NULL);  
    INSERT INTO #person(name,dob,father)Values('Grandma','1903/2/4',null);
    INSERT INTO #person(name,dob,father)Values('Dad','1925/4/2',1);
    INSERT INTO #person(name,dob,father)Values('Uncle Kev','1927/3/3',1);
    INSERT INTO #person(name,dob,father)Values('Cuz Dave','1953/7/8',4);
    INSERT INTO #person(name,dob,father)Values('Billy','1954/8/1',3);
    
    DECLARE @OldestPerson INT; 
    SET @OldestPerson = 1; -- Set this value to the ID of the oldest person in the family
    
    WITH PersonHierarchy (personID,Name,dob,father, HierarchyLevel) AS
    (
       SELECT
          personID
          ,Name
          ,dob
          ,father,
          1 as HierarchyLevel
       FROM #person
       WHERE personID = @OldestPerson
    
       UNION ALL
    
       SELECT
        e.personID,
          e.Name,
          e.dob,
          e.father,
          eh.HierarchyLevel + 1 AS HierarchyLevel
       FROM #person e
          INNER JOIN PersonHierarchy eh ON
             e.father = eh.personID
    )
    
    SELECT *
    FROM PersonHierarchy
    ORDER BY HierarchyLevel, father;
    
    DROP TABLE #person;
    



    1. 合計クエリの最大値

    2. JavaからOracleに配列を渡します:java.sql.SQLException:内部表現への変換に失敗しました:エラー

    3. LIMITをパラメータとしてMySQLsprocに渡す

    4. Python MySQLコネクタは、通常の文字列値の代わりにbytearrayを返します