2016-06-14 57 views
0

我有一个问题: 表一:SQL,OrgNode,层次

SELECT OrgNode as 'hierarchyid' 
, OrgLevel as "non-type ' 
, UniCODOBJ as 'uniqueidentifier' 
, BitREQUIRED as "bit" 
, StrField as 'nvarchar (50)' 
, StrTITLE_FIELD as 'nvarchar (50)' 
, IntCODE_LENGTH as 'int' 
OF BOX_HIERARCHY 

和我有查询:

DECLARE @CurrentNode hierarchyid 
SELECT @ CurrentNode = OrgNode 
OF BOX_HIERARCHY 
where uniCODOBJ = 'CBC33732-2E4C-4103-887A-B968E53C0E05'; 

SELECT OrgNode, OrgNode.ToString() 
, OrgLevel 
, uniCODOBJ 
, bitREQUIRED 
, strField 
, strTITLE_FIELD 
, intCODE_LENGTH 
of BOX_HIERARCHY 
where OrgNode.IsDescendantOf (@CurrentNode) = 1 

但是,这个查询返回:

OrgNode OrgNode.string OrgLevel BitRequired 
0x78/3/1 1 
0x7AC0/3/1/2 1 
0x7AD6/3/1/1/3 0 
0x7AD6B0/3/1/1/1/4 0 
0x7AD6B580/3/1/1/1/1/5 1 
0x7AD6B5AC/3/1/1/1/1/1/6 1 

因为OrgNode - > 0x78有uniCODOBJ:CBC33732-2E4C-4103-887A-B968E53C0E05

我的问题在哪里? 直子只需要:

与OrgNode - > 0x78只有1个孩子直接

OrgNode OrgNode.string OrgLevel BitRequired

0x78/3/1 1 
0x7AC0/3/1/2 1 

与OrgNode - > 0x7AC0 3个可能直接孩子 OrgNode OrgNode.string OrgLevel BitRequired

0x7AC0/3/1/2 1 
0x7AD6/3/1/1/3 0 
0x7AD6B0/3/1/1/1/4 0 
0x7AD6B580/3/1/1/1/1/5 1 

我很感兴趣,以查询wh ich以获得所有可能的直接孩子 但该查询返回我所有亲属儿童 如果我必须经过3个级别,因为在0x7AD6B5AC情况是在6级,3级至少为0x78和咨询为0x78,它返回所有我,我不在乎。

回答

0

发布了自己的解决方案:

ALTER PROCEDURE [dbo].[GET_CHILD_REPOS] @id uniqueidentifier 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @hi hierarchyid; 
    SELECT @hi = OrgNode FROM BOX_HIERARCHY 
    WHERE uniCODOBJ = @id 

    SELECT h.OrgNode.ToString() AS OrgNode, h.OrgLevel, h.uniCODOBJ, h.bitREQUIRED, 
    strFIELD, t.strARCTAB, t.strNOMOBJ 
    FROM BOX_HIERARCHY h 
    INNER JOIN tabTABLAS t 
    ON h.uniCODOBJ = t.uniCODPAD 
    WHERE OrgNode.IsDescendantOf(@hi) = 1 
    AND OrgNode <> @hi 
    AND OrgLevel <= 
    (
     SELECT MIN(OrgLevel) 
     FROM 
     (
      SELECT h.OrgNode.ToString() AS OrgNode, h.OrgLevel, h.uniCODOBJ, h.bitREQUIRED, 
      strFIELD, t.strARCTAB, t.strNOMOBJ 
      FROM BOX_HIERARCHY h 
      INNER JOIN tabTABLAS t 
      ON h.uniCODOBJ = t.uniCODPAD 
      WHERE OrgNode.IsDescendantOf(@hi) = 1 
      AND OrgNode <> @hi 
     ) a 
     WHERE bitREQUIRED = 1 
    ) 
    ORDER BY OrgNode 

END