Как я могу показать для первой записи только «Босс»? - PullRequest
1 голос
/ 06 апреля 2020

Привет,

Я пытаюсь найти начальников / менеджеров каждого сотрудника из данной таблицы, и путь должен начинаться с 'Boss->' и после Для каждой фамилии менеджера должно появиться '->', а путь должен заканчиваться фамилией менеджера сотрудника. Я использую рекурсивный 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;

Кто-нибудь может направить меня к решению? Спасибо.

1 Ответ

0 голосов
/ 06 апреля 2020

Я думаю, что вы хотите сгенерировать иерархический путь для каждого элемента в дереве:

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;

Для ваших примеров данных это генерирует набор результатов, подобный :

id | first_name | last_name | superior_id | path                        
-: | :--------- | :-------- | ----------: | :---------------------------
 1 | Simon      | Dixon     |        <em>null</em> | boss                        
 2 | Alfredo    | Garza     |           1 | boss->Dixon                 
 3 | Martin     | Lopez     |           1 | boss->Dixon                 
 4 | Jorge      | Fox       |           1 | boss->Dixon                 
 5 | Isaac      | Campbell  |           2 | boss->Dixon->Garza          
 6 | Rosemary   | Mcguire   |           3 | boss->Dixon->Lopez          
 7 | Jake       | Griffin   |           3 | boss->Dixon->Lopez          
10 | Thelma     | Lindsey   |           4 | boss->Dixon->Fox            
 8 | Garrett    | Grant     |           7 | boss->Dixon->Lopez->Griffin 
 9 | Deanna     | Olson     |           5 | boss->Dixon->Garza->Campbell
...