Как использовать sql рекурсивный без объединения всех? - PullRequest
0 голосов
/ 17 января 2020

У меня вопрос по поводу sql рекурсивной теории. определение : если общее табличное выражение использует себя в своем определении, это называется рекурсией. FedEmp(name, salary, manager)

Найти всех сотрудников, находящихся под управлением Hoover, чья зарплата превышает 100000

with agents(name, salary) as
    ((select name, salary                   --initial query
      from FedEmp 
      where manager = ‘Hoover’)
    union all
     (select f.name, f.salary               --recursive query
      from agents as a, FedEmp As f
      where f.manager = a.name))
select name from agents;                    --final query

1 Ответ

1 голос
/ 17 января 2020

Для рекурсии вам нужно UNION ALL, другого пути нет, и это по определению .

Краткое пояснение механизма, стоящего за ним :

  • 1-я часть перед UNION ALL служит для "получения начального набора строк".

  • 2-я часть после UNION ALL служит для «добавления дальнейших строк на основе того, что было найдено в предыдущей итерации».

2-ая часть продолжает выполняться до тех пор, пока не найдет новые строки для добавления (или до предела MAXRECURSION достигается, что настраивается).

Также см. этот связанный вопрос: Почему для Рекурсивного CTE в Transact- SQL требуется UNION ALL, а не UNION?

Чтобы ответить на вторую часть о поиске всех сотрудников, чья зарплата превышает 100000, я думаю, что добавление WHERE salary > 100000 в самом конце сделает это. CTE находит людей рекурсивно, еще не глядя на зарплату; а затем вы фильтруете их по зарплате.

...