Рекурсивный запрос в mysql_ - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть иерархия организаций в Organization_table. В этой таблице у меня есть такие данные, как

--------------------------------------------------------------
organization_id | organisation_type | organization_parent_id |    
--------------------------------------------------------------  Sample
101             |   Primary         | 101                    |   101
102             |   Secondary       | 101                    |    |
103             |   Secondary       | 102                    |   102
104             |   Primary         | 104                    |    |
105             |   Secondary       | 104                    |   103
106             |   Secondary       | 105                    |

Здесь 101 - основной родительский элемент для 101, 102 и 103, такой же, как 104 - основной родительский элемент для 104, 105 и 106. Таким образом, по запросу мне нужно найти основного родительского элемента. для record_id 103 и 106.

Я слаб в рекурсивном выполнении запросов, поэтому, пожалуйста, помогите мне с подходящим способом.

Спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020
WITH RECURSIVE
cte AS ( SELECT organization_id, organization_parent_id
         FROM organization_table
         WHERE organization_id IN (103, 106)
       UNION ALL
         SELECT ot.organization_id, ot.organization_parent_id
         FROM cte
         JOIN organization_table ot ON ot.organization_id = cte.organization_parent_id
         WHERE cte.organization_id != cte.organization_parent_id
       )
SELECT *
FROM cte
WHERE organization_id = organization_parent_id;

скрипка

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

Если я правильно понимаю, рекурсивный CTE выглядит так:

with recursive cte as (
      select organization_id, organization_parent_id, 1 as lev
      from organization_table ot
      where organization_id in (103, 106)
      union all
      select cte.organization_id, ot.organization_parent_id, lev + 1
      from cte join
           organization_table ot
           on ot.organization_id = cte.organization_parent_id
      where organization_id in (103, 106)
    )
select cte.*
from (select cte.*,
             row_number() over (partition by organization_id order by lev desc) as seqnum
      from cte
     ) cte
where seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...