Sql Oracle connect通过查找他的直系父母和兄弟姐妹

Sql Oracle connect通过查找他的直系父母和兄弟姐妹,sql,oracle,siblings,Sql,Oracle,Siblings,如何使用oracle connect by获得此结果 答复: 110 100 120 100 130 100 您的“连接方式”值的顺序似乎不正确。在“通过线路连接”中订购事项 但我也会重写 SELECT DISTINCT b.ID, b.depid FROM ( SELECT id, level mlevel FROM RULES WHERE LEVEL IN (2,3) START WITH ID in (115)

如何使用oracle connect by获得此结果

答复:

110 100 120 100 130 100
您的“连接方式”值的顺序似乎不正确。在“通过线路连接”中订购事项

但我也会重写

SELECT DISTINCT b.ID, b.depid
FROM
(
    SELECT id, level mlevel
    FROM RULES
    WHERE LEVEL IN (2,3)
    START WITH ID in (115)
    CONNECT BY  ID = PRIOR depid
) A
JOIN RULES b
ON (A.ID = b.depid
    AND A.mlevel = 3) OR
    (A.ID = b.ID
    AND A.mlevel = 2)
如果您总是返回一定数量的级别,那么我认为仅仅拥有连接就更容易理解/维护

With RULES (ID, DepID) AS (

SELECT 100,         0 from dual union all
SELECT 110,         100 from dual union all
SELECT 115,         110 from dual union all
SELECT 120,         100 from dual union all
SELECT 130,         100 from dual union all
SELECT 150,         110 from dual union all
SELECT 160,         110 from dual union all
SELECT 165,         110 from dual union all
SELECT 200,         195 from dual union all
SELECT 210,         110 from dual union all
SELECT 220,         0 from dual union all
SELECT 230,         110 from dual union all
SELECT 240,         0 from dual union all
SELECT 310,         110 from dual )

SELECT * 
FROM RULES 
where DEPID in (
    SELECT id 
    FROM RULES
    WHERE LEVEL = 3
    Start with ID in (115)
    CONNECT BY PRIOR depid = id)

从表中选择Id、DeptId,其中DeptId=从表中选择DeptId=从表中选择DeptId=从表中选择DeptId=从规则中选择DepId=从规则中选择DepId=从规则中选择DepId,其中Id=从规则中选择DepId,其中Id=从规则中选择DepId这对于115来说是正确的。对于110,它返回的行太多,这是不期望的。对于110,他的父母100 onlyOk应该开始明白为什么要使用connectby,但是如果它总是一个恒定的深度,就不需要使用connectby。。。选择R3.*从规则R1内部连接规则R2(在R1.DeptID=R2.ID上)内部连接规则R3(在R2.DeptID=R3.DeptID上),其中R1.ID=115更改CONNECT BY ID=PREVIER depid以CONNECT BY PREVIER depid=IDP方式连接但另一种方式,您要查找给定ID的所有祖父母子女。在此数据结构中,你了解兄弟姐妹的唯一方法是他们是否有相同的父母。
With RULES (ID, DepID) AS (

SELECT 100,         0 from dual union all
SELECT 110,         100 from dual union all
SELECT 115,         110 from dual union all
SELECT 120,         100 from dual union all
SELECT 130,         100 from dual union all
SELECT 150,         110 from dual union all
SELECT 160,         110 from dual union all
SELECT 165,         110 from dual union all
SELECT 200,         195 from dual union all
SELECT 210,         110 from dual union all
SELECT 220,         0 from dual union all
SELECT 230,         110 from dual union all
SELECT 240,         0 from dual union all
SELECT 310,         110 from dual )

SELECT * 
FROM RULES 
where DEPID in (
    SELECT id 
    FROM RULES
    WHERE LEVEL = 3
    Start with ID in (115)
    CONNECT BY PRIOR depid = id)
SELECT R3.* 
FROM RULES R1 
INNER JOIN RULES R2 
  on R1.DepID = R2.ID 
INNER JOIN RULES R3 
  on R2.DepID = R3.DepID 
WHERE R1.ID = 115