Nigdy nie używam CTE z rekurencją. Właśnie czytałem artykuł na ten temat. W tym artykule przedstawiono informacje o pracownikach za pomocą CTE serwera Sql i rekurencji. Zasadniczo jest to pokazywanie pracownikom i ich menadżerom informacji. Nie jestem w stanie zrozumieć, jak działa to zapytanie. Oto zapytanie:
WITH
cteReports (EmpID, FirstName, LastName, MgrID, EmpLevel)
AS
(
SELECT EmployeeID, FirstName, LastName, ManagerID, 1
FROM Employees
WHERE ManagerID IS NULL
UNION ALL
SELECT e.EmployeeID, e.FirstName, e.LastName, e.ManagerID,
r.EmpLevel + 1
FROM Employees e
INNER JOIN cteReports r
ON e.ManagerID = r.EmpID
)
SELECT
FirstName + ' ' + LastName AS FullName,
EmpLevel,
(SELECT FirstName + ' ' + LastName FROM Employees
WHERE EmployeeID = cteReports.MgrID) AS Manager
FROM cteReports
ORDER BY EmpLevel, MgrID
Tutaj piszę o tym, jak pokazuje się wyjście:
Muszę tylko wiedzieć, jak to najpierw pokazuje menedżerowi, a potem w pętli swojemu podwładnemu. Wydaje mi się, że pierwsza instrukcja sql uruchamia się tylko raz i zwraca wszystkie identyfikatory pracowników.
Drugie zapytanie jest wielokrotnie uruchamiane, wysyłając zapytanie do bazy danych, w której znajduje się pracownik z bieżącym identyfikatorem menedżera.
Proszę wyjaśnić, w jaki sposób instrukcja sql wykonuje się w pętli wewnętrznej, a także podać kolejność wykonania sql. Dzięki.
MOJA druga faza pytań
;WITH Numbers AS
(
SELECT n = 1
UNION ALL
SELECT n + 1
FROM Numbers
WHERE n+1 <= 10
)
SELECT n
FROM Numbers
P 1) W jaki sposób zwiększa się wartość N? jeśli wartość jest przypisywana do N za każdym razem, wówczas wartość N może być zwiększana, ale tylko przy pierwszej inicjalizacji wartości N.
Q 2) CTE i rekurencja relacji pracowniczych:
Problem zaczyna się w momencie, gdy dodam dwóch menedżerów i kilku pracowników pod drugim menedżerem.
Chcę wyświetlić szczegóły pierwszego menedżera, aw następnych wierszach tylko te szczegóły dotyczące pracowników, które dotyczą podwładnego tego menedżera.
Przypuszczać
ID Name MgrID Level
--- ---- ------ -----
1 Keith NULL 1
2 Josh 1 2
3 Robin 1 2
4 Raja 2 3
5 Tridip NULL 1
6 Arijit 5 2
7 Amit 5 2
8 Dev 6 3
Chcę wyświetlić wyniki w taki sposób za pomocą wyrażeń CTE. Proszę powiedz mi, co zmodyfikować w moim sql, który podałem tutaj, aby wyciągnąć relacje menedżer-pracownik. Dzięki.
Chcę, aby wynik wyglądał następująco:
ID Name MgrID nLevel Family
----------- ------ ----------- ----------- --------------------
1 Keith NULL 1 1
3 Robin 1 2 1
2 Josh 1 2 1
4 Raja 2 3 1
5 Tridip NULL 1 2
7 Amit 5 2 2
6 Arijit 5 2 2
8 Dev 6 3 2
Czy to możliwe...?
Chciałbym nakreślić krótką paralelę semantyczną do już poprawnej odpowiedzi.
Mówiąc „prosto”, rekurencyjne CTE można zdefiniować semantycznie jako następujące części:
1: Zapytanie CTE. Znany również jako ANCHOR.
2: Rekurencyjne zapytanie CTE na CTE w (1) z UNION ALL (lub UNION lub EXCEPT lub INTERSECT), więc ostateczny wynik jest odpowiednio zwracany.
3: Warunek narożnika / zakończenia. Co jest domyślnie, gdy nie ma więcej wierszy / krotek zwracanych przez zapytanie rekurencyjne.
Krótki przykład, który wyjaśni obraz:
Wyjaśnienie: Pierwsze zapytanie CTE zwraca dostawców podstawowych (takich jak liście), którzy nie zaopatrują bezpośrednio żadnego innego dostawcy (-1)
Rekurencyjne zapytanie w pierwszej iteracji pobiera wszystkich dostawców, którzy zaopatrują dostawców, zwracanych przez ANCHOR. Ten proces trwa do momentu, gdy warunek zwróci krotki.
UNION ALL zwraca wszystkie krotki z wszystkich wywołań rekurencyjnych.
Kolejny dobry przykład można znaleźć tutaj .
PS: Aby rekurencyjne CTE działało, relacje muszą mieć hierarchiczny (rekurencyjny) warunek do pracy. Np .: elementId = elementParentId .. masz rację.
źródło
Proces wykonywania jest naprawdę mylący z rekurencyjnym CTE, najlepszą odpowiedź znalazłem na https://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx i streszczenie procesu wykonywania CTE jest jak poniżej.
Semantyka wykonywania rekurencyjnego jest następująca:
źródło
źródło