2017-08-16 143 views
1

我使用的是SQL Server 2012的遞歸CTE SQL(親子)

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 

我使用遞歸CTE查詢

;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 

NORTH現在是一個sep在Global.Arate站點中查詢返回North和North 1的樹形結構,這是可以的。

當我將Global設爲新網站時,我不想將North列爲全球網站的一部分。

例如,添加部位2命名(NEWTEST),其是全球

LOCATIONSITECONFIG表

OID LOCATIONDETAILOID SITENAME 
1  2    TEST 
2  1    NEWTEST 

上述查詢返回 全球,NORTH,NORTH1,SOUTH SOUTH1 並再次NORTH(TEST )AND NORTH1(重複的記錄)

我想要查詢返回 全局,北(測試),NORTH1,南,南1

如果孩子已經創建了網站,查詢應該忽略。請幫助

+0

你想返回GLOBAL(NEWTEST),北(TEST),NORTH1,SOUTH SOUTH1? –

回答

0

通過將您的CTE更改爲以GLOBAL作爲定位成員開始。遞歸部分需要調整以包含SITENAME,這是通過合併(如果位置沒有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(測試)將siteoid設置爲1,並將Global(NewTEST)設置爲2.請幫助它。 – Marid

+0

所以你的意思是第四列SITEOID應該是1,2,NULL,NULL,NULL?只有在網站名稱存在的情況下才顯示siteoid? –