0

結果をインデントする必要はありません。これは、私が思いついた最高のタイトルです。どんな助けでも大歓迎です。私は CTE 経由でこれを行うのに何時間も費やしましたが、それが進むべき道のように見えますが、私は立ち往生しています。

編集: 以下のサンプル データを Component_Job 列で並べ替えることができますが、現実の世界では、ジョブ番号はランダムであり、必ずしも使用可能な順序ではありません。

私のテーブルには以下が含まれています:

Root_Job    Parent_Job  Component_Job  
1           1           1a  
1           1           1b  
1           1           1c  
1           1a          1a1  
1           1a          1a2  
1           1b          1b1  
1           1b          1b2  
2           2           2a  
2           2           2b  

以下を返すビューを作成しようとしています:

Root_Job    Parent_Job  Component_Job
1           1           1a
1           1a          1a1
1           1a          1a2
1           1           1b
1           1b          1b1
1           1b          1b2
1           1           1c
2           2           2a
2           2           2b

私が達成しようとしている返品注文を明確にするために:

1
  1a
    1a1
    1a2
  1b
    1b1
    1b2
  1c
2
  2a
  2b

最後に、私が試みているが何もしていないCTEは次のとおりです。

with BOM (Root_job, parent_job, component_Job)
as
(
-- Anchor member definition
    SELECT e.Root_Job, e.Parent_Job, e.Component_Job
    FROM Bill_Of_Jobs AS e
    WHERE Root_Job = Parent_Job
    UNION ALL
-- Recursive member definition
    SELECT e.Root_Job, e.Parent_Job, e.Component_Job
    FROM Bill_Of_Jobs AS e
    INNER JOIN bill_of_Jobs AS d
    ON e.parent_Job = d.Component_Job
)
-- Statement that executes the CTE
SELECT * from BOM
4

2 に答える 2

1

ここに役立つものがあるかもしれません:

declare @Jobs as Table ( ParentJob VarChar(10), ComponentJob VarChar(10) );
insert into @Jobs ( ParentJob, ComponentJob ) values
  ( '1', '1a' ), ( '1', '1b' ), ( '1', '1c' ),
  ( '1a', '1a1' ), ( '1a', '1a2' ), ( '1b', '1b1' ), ( '1b', '1b2' ),
  ( '2', '2a' ), ( '2', '2b' );

select * from @Jobs;

with Roots as (
  -- Find and fudge the root jobs.
  --   Usually they are represented as children without parents, but here they are implied by the presence of children.
  select distinct 1 as Depth, ParentJob as RootJob, Cast( ParentJob as VarChar(1024) ) as Path, ParentJob, ParentJob as ComponentJob
    from @Jobs as J
    where not exists ( select 42 from @Jobs where ComponentJob = J.ParentJob ) ),
  BoM as (
  -- Anchor the indented BoM at the roots.
  select Depth, RootJob, Path, ParentJob, ComponentJob
    from Roots
  union all
  -- Add the components one level at a time.
  select BoM.Depth + 1, BoM.RootJob, Cast( BoM.Path + '»' + J.ComponentJob as VarChar(1024) ), J.ParentJob, J.ComponentJob
    from BoM inner join
      @Jobs as J on J.ParentJob = BoM.ComponentJob )
  -- Show the result with indentation.
  select *, Space( Depth * 2 ) + ComponentJob as IndentedJob
    from BoM
    order by ComponentJob
    option ( MaxRecursion 0 );

現実の世界では、これほど簡単に分類できるものはめったにありません。数値項目 (1、1.1、1.1.1、1.2) の秘訣は、アルファベット順で正しくソートされるように、各値に 、、、Pathなどの固定長にゼロが埋め込まれた を作成することです。データは異なる場合があります。00010001»00010001»0001»00010001»0002

于 2013-09-06T18:40:52.300 に答える
1
SELECT *
FROM BOM
ORDER BY LEFT(Component_Job+'000',3)
于 2013-09-06T17:39:33.870 に答える