Sql server 父子关系-Sql查询

Sql server 父子关系-Sql查询,sql-server,tsql,Sql Server,Tsql,我的消息来源如下 OSPID OSPNAME RELATEDOSPID 100004 LEVEL4 100003 100003 LEVEL3 100002 100002 LEVEL2 100001 100001 LEVEL1 0 100009 LEVEL4 100008 100008 LEVEL2 100007 我需要结果 L4OSPID L4OSPNAME L3RELATEDID L3OSPNAME L2RELATEDID L2OSPNAME L1

我的消息来源如下

OSPID     OSPNAME RELATEDOSPID
100004  LEVEL4  100003
100003  LEVEL3  100002
100002  LEVEL2  100001
100001  LEVEL1  0
100009  LEVEL4  100008
100008  LEVEL2  100007
我需要结果

L4OSPID L4OSPNAME   L3RELATEDID L3OSPNAME   L2RELATEDID L2OSPNAME   L1RELATEDID L2OSPNAME   ROOTNODE
100004   LEVEL4      100003      LEVEL3      100002      LEVEL2      100001      LEVEL1        0
100009   LEVEL4      100008      NULL        NULL        LEVEL2      100007      NULL         NULL
如果中间缺少任何级别,则应将其设置为NULL


谢谢

假设只有4级,并且您总是希望从4级开始,下面是查询

select L4.OSPID as L4OSPID, L4.OSPNAME as L4OPSNAME,
L4.RELATEDOSPID
 as L3RELATEDID,

case 
    WHEN L3.OSPNAME = 'LEVEL3' THEN L3.OSPNAME
    ELSE NULL
end as L3OSPNAME,

case 
    WHEN L3.OSPNAME = 'LEVEL3' THEN L3.RELATEDOSPID
    ELSE NULL
end as L2RELATEDID,

case 
    WHEN L3.OSPNAME = 'LEVEL2' THEN L3.OSPNAME
    WHEN L2.OSPNAME = 'LEVEL2' THEN L2.OSPNAME
    ELSE NULL
end as L2OSPNAME,

case WHEN L3.OSPNAME = 'LEVEL2' THEN  L3.RELATEDOSPID
    WHEN L2.OSPNAME = 'LEVEL2' THEN  L2.RELATEDOSPID
    ELSE NULL
end
 as L1RELATEDID,

case 
    WHEN L3.OSPNAME = 'LEVEL1' THEN L3.OSPNAME
    WHEN L2.OSPNAME = 'LEVEL1' THEN L2.OSPNAME
    WHEN L1.OSPNAME = 'LEVEL1' THEN L1.OSPNAME
    ELSE NULL
end as L1OSPNAME,

case 
    WHEN L3.OSPNAME = 'LEVEL1' THEN L3.RELATEDOSPID
    WHEN L2.OSPNAME = 'LEVEL1' THEN L2.RELATEDOSPID
    WHEN L1.OSPNAME = 'LEVEL1' THEN L1.RELATEDOSPID
    ELSE NULL
end as ROOTNODE


from osptable as L4

left outer join osptable as L3
on L4.RELATEDOSPID = L3.OSPID
left outer join osptable as L2
on L3.RELATEDOSPID = L2.OSPID
left outer join osptable as L1
on L2.RELATEDOSPID = L1.OSPID
where L4.OSPNAME = 'LEVEL4'
这给了我这个结果,我认为这是一个理想的结果

100004  LEVEL4  100003  LEVEL3  100002  LEVEL2  100001  LEVEL1  0
100009  LEVEL4  100008  NULL    NULL    LEVEL2  100007  NULL    NULL

除了丢失的记录外,是否始终存在这4个级别?Peter:是的,可能存在所有4个级别都链接的记录,也可能存在中间链接丢失的记录。您的最后一行指向100007,但该行不存在。你的样品有误吗?