0

データセットが少し乱雑で、特定の親アカウントのすべての子アカウントを取得する必要があります。

表は次のとおりです

コード(PK)、名前、ParentCode

外部キーはありません

アカウントに親がないかどうかを確認すると、ParentCodeは空の文字列であるか、Codeと同じに設定されています。

http://msdn.microsoft.com/en-us/library/ms186243(v=sql.105).aspxをフォローしようとしていますが、すべてのデータが返されているようです。さらに、どうすればよいかわかりません。 1つのアカウントで子供を取得します。

WITH DirectReports (ParentCus, Code, Name, Level)
AS
(
    SELECT ParentCode, Code, Name, 0 AS Level
    FROM Customers
      WHERE Code = ParentCode OR Code = ''
    UNION ALL

    SELECT c.ParentCode, c.Code, c.Name, level + 1
    FROM Customers AS C
    INNER JOIN DirectReports AS d
        ON c.ParentCode = d.Code
        where c.Code != d.Code
)
SELECT ParentCus, Code, Name, Level
FROM DirectReports

編集 明確にするために、関数にコードを渡して、アカウントの子アカウントであるすべてを(再帰的に)返すことができる必要があります。

最終的なコード 答えに少し変更を加える必要がありましたが、これが最終的な作業コードです

declare @t table(code varchar(10), name varchar(10), parentcode varchar(10))
insert @t values(1, 'navn1', '1')
insert @t values(2, 'navn2', '')
insert @t values(3, 'navn3', 1)
insert @t values(4, 'navn4', 3)
insert @t values(5, 'navn5',4)
insert @t values(6, 'navn6', 2)
insert @t values(7, 'navn7', 3)

declare @code varchar(10) -- or however code/parentcode is declared
set @code = '1'           -- the parentcode you are trying to isolate

;WITH DirectReports (ParentCus, Code, Name, Level)
AS
(
    SELECT ParentCode, Code, Name, 0 AS Level
    FROM @t Customers
    -- this picks the chosen code
      WHERE Code = @code and (Code = ParentCode OR PARENTCode = '')
    UNION ALL
    SELECT c.ParentCode, c.Code, c.Name, level + 1
    FROM
        (select * from @t where  code !=  parentcode) --had to do this to account for an infinate loop
        as C
    INNER JOIN DirectReports AS d
        ON c.ParentCode = d.Code

)
SELECT ParentCus, Code, Name, Level
FROM DirectReports
-- level > 0: to ensure child accounts only
where level > 0
4

2 に答える 2

0
;With CTE as 
(
select ParentCode, Code, Name,row_number() over (order by (select 0)) as rn from Customers
)

,DirectReports as (ParentCus, Code, Name, Level)
AS
(
    SELECT rn,ParentCode, Code, Name, 0 AS Level
    FROM CTE WHERE rn=1 and (Code = ParentCode OR Code = '')
    UNION ALL

    SELECT c.ParentCode, c.Code, c.Name, level + 1
    FROM CTE AS C
    INNER JOIN DirectReports AS d
        ON c.ParentCode = d.Code and c.rn=d.rn+1
        where c.Code != d.Code
)
SELECT ParentCus, Code, Name, Level
FROM DirectReports
于 2012-09-11T06:42:10.387 に答える
0

必要なコードを指定する必要があります。この例では、@tを使用してテーブルCustomersを置き換えています

declare @t table(code varchar(10), name varchar(10), parentcode varchar(10))
insert @t values(1, 'navn1', '')
insert @t values(2, 'navn2', '')
insert @t values(3, 'navn3', 1)

declare @code varchar(10) -- or however code/parentcode is declared
set @code = '1'           -- the parentcode you are trying to isolate

;WITH DirectReports (ParentCus, Code, Name, Level)
AS
(
    SELECT ParentCode, Code, Name, 0 AS Level
    FROM @t Customers
    -- this picks the chosen code
      WHERE Code = @code and (Code = ParentCode OR PARENTCode = '')
    UNION ALL
    SELECT c.ParentCode, c.Code, c.Name, level + 1
    FROM @t C
    INNER JOIN DirectReports AS d
        ON c.ParentCode = d.Code
    -- added to prevent infinite loop, 
    -- I should point out that when this happens, you have bad data in your base
    WHERE c.ParentCode <> c.Code
)
SELECT ParentCus, Code, Name, Level
FROM DirectReports
-- level > 0: to ensure child accounts only
-- level < 100:to prevent infinite loops caused by circular references
where level > 0 and level < 100
于 2012-09-11T08:36:12.720 に答える