1

ServiceID、ParentID、Description を含む "Services" というテーブルがあります。ParentID は別のレコードの ServiceID です。データは、アイテムの複数レベルの階層を形成し、「ルート」アイテムの ParentID がゼロに設定されるようにセットアップされます。各レコードのルート親までのすべての親のスレッドを表示する新しいフィールドを持つクエリを作成するにはどうすればよいですか。もちろん、ルート アイテムのこのフィールドは空白になります。例として車を使用すると、エントリ「X3」と「Punto」に対して、このフィールド内にそのようなテキストをそれぞれ入れたいと思います。

自動車 > ドイツ > BMW > 4 輪駆動 > X3

自動車 > イタリア > FIAT > 前輪駆動 > プント

ServiceID をフィードし、スレッド化された説明を含む文字列値を取得するために必要な再帰を行う関数が必要だと思います。グーグル単項関係を試してみましたが、必要な関数のコードを含む例が見つかりませんでした。

前もって感謝します!

アップデート:

私のテーブルは次のようになります。

CREATE TABLE [dbo].[Services](
[ServiceID] [int] IDENTITY(1,1) NOT NULL,
[ParentID] [int] NULL,
[ServiceDescription] [nvarchar](250) NULL)
4

2 に答える 2

1

一般的な例を次に示します。コピーして貼り付けて実行すると、出力が表示されます。これが機能する場合は、テーブルと列の値を変更して、状況に合わせて機能させることができるはずです。

If      Object_ID('dbo.Services') Is Not Null Drop Table [dbo].[Services];
Create  Table [dbo].[Services] (ServiceID Int Identity(1,1) NOT NULL, ParenServiceID Int NULL, ServiceDescription Nvarchar(250) NULL);

Insert  [dbo].[Services]
Select  null, 'Automobiles'
Union   All
Select  1, 'Germany'
Union   All
Select  2, 'BMW'
Union   All
Select  3, '4 Wheel Drive'
Union   All
Select  1, 'Italy'
Union   All
Select  5, 'FIAT'
Union   All
Select  4, 'X3'
Union   All
Select  6, 'Front Wheel Drive'
Union   All
Select  8, 'Punto';

With    recurCTE As
(
        Select  h.ServiceID, h2.ParenServiceID As nextParent, Convert(Varchar(max),Isnull(h2.ServiceDescription + ' > ','') + h.ServiceDescription) As Hierarchy
        From    [dbo].[Services] h
        Left    Join [dbo].[Services] h2
                On  h.ParenServiceID = h2.ServiceID
        Union   All
        Select  rc.ServiceID, h.ParenServiceID As nextParent, Convert(Varchar(max),Isnull(h.ServiceDescription + ' > ','') + rc.Hierarchy) As Hierarchy
        From    recurCTE rc
        Join    [dbo].[Services] h
                On  rc.nextParent = h.ServiceID
),      orderedResults As
(
        Select  ServiceID, Hierarchy
        From   (Select  Row_Number() Over (Partition By ServiceID Order By Len(Hierarchy) Desc) As lenPriID,
                        ServiceID,
                        Hierarchy
                From    recurCTE) As n
        Where   lenPriID = 1
)
Select  h.*, o.Hierarchy
From    orderedResults o
Join    [dbo].[Services] h
        On  o.ServiceID = h.ServiceID
Where   ServiceDescription In ('X3','Punto');
于 2013-03-27T16:26:25.317 に答える
0

左結合を妥当な制限 (20 など) まで使用してから、文字列を連結します。

 declare @services table (ServiceID int , ParentID int,[Description] varchar(20))

 insert @services
 select 1,null,'automobiles' union
 select 2,null,'hotels' union
 select 3,1,'Germany' union
 select 4,3,'BMW' union
 select 5,3,'Audi' union
 select 6,2,'Hawaii' union
 select 7,2,'Australia'

 select  

 s.Description+'>'+s2.Description+'>'+isnull(s3.Description,'')+'>'+isnull(s4.Description,'')
 from @services s
 left join @services s2 on (s2.ParentID=s.ServiceID)
 left join @services s3 on (s3.ParentID=s2.ServiceID)
 left join @services s4 on (s4.ParentID=s3.ServiceID)
 left join @services s5 on (s5.ParentID=s4.ServiceID)
于 2013-03-27T16:08:48.303 に答える