Oracle SQL>&燃气轮机;同一表中父、子和孙的分层查询
我的表中有如下结构的数据Oracle SQL>&燃气轮机;同一表中父、子和孙的分层查询,sql,oracle,oracle10g,recursive-query,connect-by,Sql,Oracle,Oracle10g,Recursive Query,Connect By,我的表中有如下结构的数据 Manager Id Employee id chartfield SM1 MGR-1 12 SM2 MGR-1 12 MGR-1 LEAD-1 12 MGR-1 LEAD-2 12 MGR-1 LEAD-3 12 LEAD-1 LEAD-2 12 LEAD-1 ASSOCIATE
Manager Id Employee id chartfield
SM1 MGR-1 12
SM2 MGR-1 12
MGR-1 LEAD-1 12
MGR-1 LEAD-2 12
MGR-1 LEAD-3 12
LEAD-1 LEAD-2 12
LEAD-1 ASSOCIATE -1 12
LEAD-1 ASSOCIATE -2 12
LEAD-2 LEAD-3 12
LEAD-2 ASSOCIATE -3 12
LEAD-2 ASSOCIATE -4 12
LEAD-3 ASSOCIATE -5 12
LEAD-3 ASSOCIATE -6 12
ASSOCIATE -1 JUNIOR - 1 12
ASSOCIATE -1 JUNIOR - 2 12
ASSOCIATE -2 JUNIOR - 1 12
ASSOCIATE -2 JUNIOR - 2 12
Manager Id Employee id chartfield LEVEL1
MGR-1 LEAD-1 12 1
MGR-1 LEAD-2 12 1
MGR-1 LEAD-3 12 1
MGR-1 ASSOCIATE -1 12 2
MGR-1 ASSOCIATE -2 12 2
MGR-1 ASSOCIATE -3 12 2
MGR-1 ASSOCIATE -4 12 2
MGR-1 ASSOCIATE -5 12 2
MGR-1 ASSOCIATE -6 12 2
MGR-1 JUNIOR - 1 12 3
MGR-1 JUNIOR - 2 12 3
我期望经理和员工的产出与他们目前的水平一致。这里唯一的标准是同一个员工可以向多个经理报告,在这种情况下,我们应该只选择向级别最低的员工报告的不同员工。在上述情况下,2号领导向1号经理和1号领导报告,但我们正在考虑最低级别
示例输出可能如下所示:
Manager Id Employee id chartfield
SM1 MGR-1 12
SM2 MGR-1 12
MGR-1 LEAD-1 12
MGR-1 LEAD-2 12
MGR-1 LEAD-3 12
LEAD-1 LEAD-2 12
LEAD-1 ASSOCIATE -1 12
LEAD-1 ASSOCIATE -2 12
LEAD-2 LEAD-3 12
LEAD-2 ASSOCIATE -3 12
LEAD-2 ASSOCIATE -4 12
LEAD-3 ASSOCIATE -5 12
LEAD-3 ASSOCIATE -6 12
ASSOCIATE -1 JUNIOR - 1 12
ASSOCIATE -1 JUNIOR - 2 12
ASSOCIATE -2 JUNIOR - 1 12
ASSOCIATE -2 JUNIOR - 2 12
Manager Id Employee id chartfield LEVEL1
MGR-1 LEAD-1 12 1
MGR-1 LEAD-2 12 1
MGR-1 LEAD-3 12 1
MGR-1 ASSOCIATE -1 12 2
MGR-1 ASSOCIATE -2 12 2
MGR-1 ASSOCIATE -3 12 2
MGR-1 ASSOCIATE -4 12 2
MGR-1 ASSOCIATE -5 12 2
MGR-1 ASSOCIATE -6 12 2
MGR-1 JUNIOR - 1 12 3
MGR-1 JUNIOR - 2 12 3
您的示例数据显示每个人都向SM1和SM2报告。。。无论如何,假设应该正确处理重复的管理器,即只应选择一个,那么下面的查询如何:
WITH t (
MANAGER_ID,
EMPLOYEE_ID,
LEVEL_NUM
) AS (
SELECT
e.MANAGER_ID,
e.MANAGER_ID,
0 AS LEVEL_NUM
FROM
emp e
WHERE
e.MANAGER_ID NOT IN (
SELECT
e.EMPLOYEE_ID
FROM
emp e
)
UNION ALL
SELECT
t.MANAGER_ID,
e.EMPLOYEE_ID,
t.LEVEL_NUM + 1 AS LEVEL_NUM
FROM
emp e
JOIN
t
ON
e.MANAGER_ID = t.EMPLOYEE_ID
)
SELECT
MANAGER_ID,
EMPLOYEE_ID,
LEVEL_NUM
FROM
(
SELECT
MANAGER_ID,
EMPLOYEE_ID,
LEVEL_NUM,
ROW_NUMBER() OVER (PARTITION BY EMPLOYEE_ID ORDER BY LEVEL_NUM, MANAGER_ID) AS ROW_NUM
FROM
t
) t
WHERE
t.ROW_NUM = 1 -- keep only the first manager
AND
t.LEVEL_NUM > 0 -- exclude top level managers reporting to themselves
ORDER BY
t.LEVEL_NUM,
t.MANAGER_ID,
t.EMPLOYEE_ID;
以及用于处理数据周期的查询:
WITH t (
MANAGER_ID,
EMPLOYEE_ID,
PATH,
LEVEL_NUM
) AS (
SELECT
e.MANAGER_ID,
e.MANAGER_ID,
'> ' || e.MANAGER_ID AS PATH,
0 AS LEVEL_NUM
FROM
emp e
UNION ALL
SELECT
t.MANAGER_ID,
e.EMPLOYEE_ID,
t.PATH || ' > ' || e.EMPLOYEE_ID AS PATH,
t.LEVEL_NUM + 1 AS LEVEL_NUM
FROM
emp e
JOIN
t
ON
e.MANAGER_ID = t.EMPLOYEE_ID
WHERE
t.PATH NOT LIKE '%> ' || e.EMPLOYEE_ID || '%'
)
SELECT
t.MANAGER_ID,
t.EMPLOYEE_ID,
t.LEVEL_NUM
FROM
(
SELECT
t.MANAGER_ID,
t.EMPLOYEE_ID,
t.LEVEL_NUM,
ROW_NUMBER() OVER (PARTITION BY t.MANAGER_ID, t.EMPLOYEE_ID ORDER BY t.LEVEL_NUM) AS ROW_NUM
FROM
t
) t
WHERE
t.ROW_NUM = 1 -- keep only the first employee occurance
AND
t.LEVEL_NUM > 0 -- exclude top level managers reporting to themselves
AND
t.MANAGER_ID = 'SM1' -- selected manager
ORDER BY
t.LEVEL_NUM,
t.MANAGER_ID,
t.EMPLOYEE_ID;
请仅使用相关产品标签,或者MGR-1如何向SM1和SM2报告(两者似乎处于同一级别)?这两条记录应该保留在输出中还是只保留一条?古格利:你在7小时前回答了一个问题(在我写这篇评论的时候)。12小时前,同一位论坛成员miazo向您提出了上述问题。你来到这里,你回答了他的回答,但没有回答上面的问题。为什么不呢?这是一个非常重要的问题,非常有意义,您需要回答它,否则任何人都无法为您的问题提供一个好的解决方案。在运行时,我会将经理id指定为“MGR-1”,以便将所有潜在客户、员工和下级报告提供给他。但是上面的sql给出了循环冗余错误。如果您得到了一个循环错误,那么您的测试数据中就有了循环(不是这里发布的示例数据,第一个查询就可以在它上面运行)。我添加了另一个查询来处理这个问题,请检查这是否解决了您的问题。