【问题标题】:How can I show for the first entry only 'Boss'?我怎样才能只为第一个条目显示“老板”?
【发布时间】:2020-07-18 05:07:56
【问题描述】:

您好,

我正在尝试从给定表中查找每个员工的上级/经理,路径应以“老板->”开头,在经理的每个姓氏之后应出现“->”,路径应以员工经理的姓氏结尾。我正在使用递归 CTE,但不知何故我从查询中获取数据是错误的。 我有以下结果表:

id | first_name | last_name | superior_id |               path                |
----+------------+-----------+-------------+-----------------------------------+
  1 | Simon      | Dixon     | null        | Boss->Dixon                       |
  2 | Alfredo    | Garza     | 1           | Boss->Garza->Garza                |
  3 | Martin     | Lopez     | 1           | Boss->Lopez->Lopez                |
  4 | Jorge      | Fox       | 1           | Boss->F->Fox                      |
  5 | Isaac      | Campbell  | 2           | Boss->Garza->Campbell->Campbell   |
  6 | Rosemary   | Mcguire   | 3           | Boss->Lopez->Mcguire->Mcguire     |
  7 | Jake       | Griffin   | 3           | Boss->Lopez->Griff->Griffin       |
 10 | Thelma     | Lindsey   | 4           | Boss->F->Lindsey->Lindsey         |
  8 | Garrett    | Grant     | 7           | Boss->Lopez->Griff->Grant->Grant  |
  9 | Deanna     | Olson     | 5           | Boss->Garza->Campbell->Ols->Olson |

结果我得到上表的查询:

WITH RECURSIVE hiearchy AS (
SELECT
id,
first_name,
last_name,
superior_id,
'Boss' AS path
FROM employee
WHERE superior_id IS NULL
UNION
SELECT
employee.id,
employee.first_name,
employee.last_name,
employee.superior_id,
concat(trim(path,'->Dixon'), '->', employee.last_name)
FROM employee join hiearchy
On employee.superior_id=hiearchy.id
)

SELECT
id,
first_name,
last_name,
superior_id,
concat(trim(path,'->Dixon'), '->', last_name) as path
From hiearchy;

有人能指导我解决问题吗? 谢谢。

【问题讨论】:

  • 请向我们展示您期望的结果。
  • 正是那个,@GMB。谢谢。

标签: sql postgresql common-table-expression hierarchical-data recursive-query


【解决方案1】:

我认为您想为树中的每个元素生成分层路径:

with recursive hiearchy as (
    select
        id,
        first_name,
        last_name,
        superior_id,
        'boss' as path
    from employee
    where superior_id is null
    union all
    select
        e.id,
        e.first_name,
        e.last_name,
        e.superior_id,
        path || '->' || h.last_name
    from employee e
    join hiearchy h on e.superior_id = h.id
)
select h.* from hiearchy h;

对于您的示例数据,这会生成a resultset like

编号 |名字 |姓氏 |优越_id |小路 -: | :--------- | :-------- | ----------: | :---------------------------- 1 |西蒙 |狄克逊 | |老板 2 |阿尔弗雷多 |加尔萨 | 1 |老板->狄克逊 3 |马丁 |洛佩兹 | 1 |老板->狄克逊 4 |豪尔赫 |福克斯 | 1 |老板->狄克逊 5 |艾萨克 |坎贝尔 | 2 |老板->迪克森->加尔萨 6 |迷迭香 |麦奎尔 | 3 |老板->迪克森->洛佩兹 7 |杰克 |格里芬 | 3 |老板->迪克森->洛佩兹 10 |塞尔玛 |林赛 | 4 |老板->狄克逊->福克斯 8 |加勒特 |格兰特| 7 |老板->迪克森->洛佩兹->格里芬 9 |迪安娜 |奥尔森 | 5 | boss->Dixon->Garza->Campbell

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    相关资源
    最近更新 更多