2017-08-16 21 views
1

私は、SQL Server 2012の私は、再帰CTEクエリ再帰CTE SQL(親子)

;WITH LOCALSITEHIERARCHY AS 
(
    SELECT A.OID 
      ,A.PARENTOID 
      ,CAST(A.LOCATIONNAME + ' (' + LSC.SITENAME + ')' AS NVARCHAR(100)) AS NAME 
      ,LSC.OID AS SITEOID 
    FROM LOCATIONDETAIL A 
      INNER JOIN LOCATIONSITECONFIG LSC 
       ON LSC.LOCATIONDETAILOID = A.OID     
    WHERE 
      LSC.SITENAME <> 'GLOBAL' AND LSC.RECSTATUS = 'A' 
    UNION ALL 
    SELECT 
     A.OID 
     ,A.PARENTOID 
     ,CAST(A.LOCATIONNAME AS NVARCHAR(100))     
     ,LH.SITEOID 
    FROM LOCATIONDETAIL A 
     INNER JOIN LOCALSITEHIERARCHY LH ON A.PARENTOID = LH.OID 
) 

SELECT * FROM LOCALSITEHIERARCHY 
を使用

LOCATIONDETAILテーブル

OID  LOCATIONNAME PARENTID 
1   GLOBAL   0 
2   NORTH   1 
3   SOUTH   1 
4   NORTH1   2 
5   SOUTH1   3 

LOCATIONSITECONFIGテーブル

OID LOCATIONID SITENAME 
1  2  TEST 

を使用しています

ノースは今やセピアですこの問合せは、NorthおよびNorth 1をツリー構造で返します。これは問題ありません。

グローバルを新しいサイトとして作成すると、グローバルサイトの一部としてNorthを含める必要はありません。

例、

LOCATIONSITECONFIGテーブル

OID LOCATIONDETAILOID SITENAME 
1  2    TEST 
2  1    NEWTEST 

上記のクエリ返し グローバル、NORTH、NORTH1、南、SOUTH1 と再びNORTH(TESTはグローバルである(NEWTEST)と名付けられた追加サイト2、 )AND NORTH1(レコードの重複)

返信するクエリを返します。 グローバル、NORTH1(テスト)、NORTH1、SOUTH、SOUTH1

子サイトがすでに作成されている場合は、クエリは無視されます。助けてください

+0

あなたは、GLOBAL(NEWTEST)、NORTH(TEST)、NORTH1、SOUTH、SOUTH1を返すようにしたいでしたか? –

答えて

0

アンカーメンバーとしてGLOBALで始まるようにCTEを変更してください。再帰部分は、SITENAMEを含むように調整する必要があります。これは、結合(サイト名にサイト名がない場合)とサブクエリによって行われます。

with LOCALSITEHIERARCHY 
    as (
    select A.OID 
      , A.PARENTOID 
      , cast(A.LOCATIONNAME+' ('+LSC.SITENAME+')' as nvarchar(100)) as NAME 
      , LSC.OID as SITEOID 
      , cast(row_number() over(partition by parentoid order by A.LOCATIONNAME) as varchar(max)) as [PATH] 
    from LOCATIONDETAIL as A 
      inner join LOCATIONSITECONFIG as LSC on LSC.LOCATIONDETAILOID = A.OID 
    where 1 = 1 
      and A.PARENTOID is null 
      and LSC.RECSTATUS = 'A' 
    union all 
    select A.OID 
      , A.PARENTOID 
      , cast(coalesce(A.LOCATIONNAME+' ('+ 
         (
          select SITENAME 
          from LOCATIONSITECONFIG C 
          where C.LOCATIONDETAILOID = A.OID 
         )+')', A.LOCATIONNAME) as nvarchar(100)) as NAME 
      , coalesce((select C.OID from LOCATIONSITECONFIG C where C.LOCATIONDETAILOID = A.OID),NULL) as SITEOID 
      , [path]+'-'+cast(row_number() over(partition by A.parentoid order by A.LOCATIONNAME) as varchar(max)) 
    from LOCATIONDETAIL as A 
      inner join LOCALSITEHIERARCHY as LH on A.PARENTOID = LH.OID) 

    select * from LOCALSITEHIERARCHY order by [PATH]; 

結果は次の図のとおりです。

Result from Query

+0

ありがとうKoen、よくドラフトされた答え。試してみましょう。 – Marid

+0

私は解決策を試しました。それに応じてSiteOIDが表示され、LOCATIONSITECONFIGの最後のOIDが繰り返し表示されます。 NORTH(Test)にsiteoidを1、Global(NewTEST)を2としたいと思っています。それを手伝ってください。 – Marid

+0

したがって、4番目の列SITEOIDは1、2、NULL、NULL、NULLにする必要がありますか?サイト名が場所のために存在する場合にのみ、サイトoidを表示しますか? –