2017-08-16 146 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? –