Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL>&燃气轮机;同一表中父、子和孙的分层查询_Sql_Oracle_Oracle10g_Recursive Query_Connect By - Fatal编程技术网

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给出了循环冗余错误。如果您得到了一个循环错误,那么您的测试数据中就有了循环(不是这里发布的示例数据,第一个查询就可以在它上面运行)。我添加了另一个查询来处理这个问题,请检查这是否解决了您的问题。