Как получить данные иерархии с динамическими изменениями c - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть таблица emp следующим образом:

Empname              Mgr_hierarchy            
-------    ---------------------------------
arjun      Giri    | Raj    | Suresh
arun       arjun   | Giri   | Raj    | Suresh
alex       Pandey  | Ravi   | Suresh
adam       alex    | Pandey | Ravi   | Suresh
bux        alex    | Pandey | Ravi   | Suresh
bony       Agarwal | Ram    | Nitesh | Suresh

Таблица менеджера выглядит следующим образом:

Mgr_names
----------
Raj
Ram
Ravi

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

Я использовал следующий код для этого

    select empname from `project.dataset.emp`
 where 
(mgr_hierarchy like '%Raj%' or mgr_hierarchy like '%Ravi%' or mgr_hierarchy like '%Ram%')

Но проблема в том, что таблица менеджера динамически меняется; на данный момент он содержит 3 значения после одного месяца, эти менеджеры заменяются другими 3 или 4 значениями. Поэтому каждый раз я меняю состояние. Есть ли какие-то решения для этого?

Ответы [ 3 ]

1 голос
/ 20 февраля 2020

Используйте split() и unnest():

select e.*
from emp e cross join
     (unnest(split(e.Mgr_hierarchy, ' | '))) as mgr join
     manager m
     on m.mgr_name = mgr;

Я бы порекомендовал вам исправить структуру данных. Кодирование иерархий в виде фиксированных строк довольно болезненно. По крайней мере, вы могли бы использовать массивы.

0 голосов
/ 20 февраля 2020

Как ответил Nike sh, использование предложения IN с подзапросом сделает работу:

SELECT empname FROM `project.dataset.emp`
WHERE (mgr_hierarchy IN
  (SELECT names FROM Mgr_names))

Я сделал новый ответ, так как предложение LIKE не нужно.

0 голосов
/ 20 февраля 2020

Вы можете использовать в операторе как:

select empname from `project.dataset.emp`
 where 
(mgr_hierarchy in (select names from Mgr_names where names like '%your search query%'  ) )
enter code here

Теперь вы можете искать любые имена, которые получат всю принадлежность из таблицы Mgr_names, и для этих членов будет напечатано empname.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...