sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server CTE og rekursion eksempel

Jeg har ikke testet din kode, bare prøvet at hjælpe dig med at forstå, hvordan den fungerer i kommentarfeltet;

WITH
  cteReports (EmpID, FirstName, LastName, MgrID, EmpLevel)
  AS
  (
-->>>>>>>>>>Block 1>>>>>>>>>>>>>>>>>
-- In a rCTE, this block is called an [Anchor]
-- The query finds all root nodes as described by WHERE ManagerID IS NULL
    SELECT EmployeeID, FirstName, LastName, ManagerID, 1
    FROM Employees
    WHERE ManagerID IS NULL
-->>>>>>>>>>Block 1>>>>>>>>>>>>>>>>>
    UNION ALL
-->>>>>>>>>>Block 2>>>>>>>>>>>>>>>>>    
-- This is the recursive expression of the rCTE
-- On the first "execution" it will query data in [Employees],
-- relative to the [Anchor] above.
-- This will produce a resultset, we will call it R{1} and it is JOINed to [Employees]
-- as defined by the hierarchy
-- Subsequent "executions" of this block will reference R{n-1}
    SELECT e.EmployeeID, e.FirstName, e.LastName, e.ManagerID,
      r.EmpLevel + 1
    FROM Employees e
      INNER JOIN cteReports r
        ON e.ManagerID = r.EmpID
-->>>>>>>>>>Block 2>>>>>>>>>>>>>>>>>
  )
SELECT
  FirstName + ' ' + LastName AS FullName,
  EmpLevel,
  (SELECT FirstName + ' ' + LastName FROM Employees
    WHERE EmployeeID = cteReports.MgrID) AS Manager
FROM cteReports
ORDER BY EmpLevel, MgrID
 

Det enkleste eksempel på en rekursiv CTE Jeg kan komme i tanke om at illustrere dens funktion er;

;WITH Numbers AS
(
    SELECT n = 1
    UNION ALL
    SELECT n + 1
    FROM Numbers
    WHERE n+1 <= 10
)
SELECT n
FROM Numbers
 

Q 1) hvordan værdien af ​​N bliver øget. hvis værdien tildeles til N hver gang, kan N-værdien øges, men kun første gang, N-værdien blev initialiseret .

A1: I dette tilfælde N er ikke en variabel. N er et alias. Det svarer til SELECT 1 AS N . Det er en syntaks af personlig præference. Der er 2 hovedmetoder til aliasing af kolonner i en CTE i T-SQL . Jeg har inkluderet analogen til en simpel CTE i Excel at forsøge at illustrere på en mere velkendt måde, hvad der sker.

--  Outside
;WITH CTE (MyColName) AS
(
    SELECT 1
)
-- Inside
;WITH CTE AS
(
    SELECT 1 AS MyColName
    -- Or
    SELECT MyColName = 1  
    -- Etc...
)
 

Spørgsmål 2) nu her om CTE og rekursion af medarbejderrelationer i det øjeblik, jeg tilføjer to ledere og tilføjer et par flere medarbejdere under anden leder, derefter problemstart. Jeg vil vise første lederdetaljer, og i de næste rækker vil kun disse medarbejderoplysninger komme dem, der er underordnet den leder

A2:

Besvarer denne kode dit spørgsmål?

-------------------------------------------- -- Synthesise table with non-recursive CTE -------------------------------------------- ;WITH Employee (ID, Name, MgrID) AS ( SELECT 1, 'Keith', NULL UNION ALL SELECT 2, 'Josh', 1 UNION ALL SELECT 3, 'Robin', 1 UNION ALL SELECT 4, 'Raja', 2 UNION ALL SELECT 5, 'Tridip', NULL UNION ALL SELECT 6, 'Arijit', 5 UNION ALL SELECT 7, 'Amit', 5 UNION ALL SELECT 8, 'Dev', 6 ) -------------------------------------------- -- Recursive CTE - Chained to the above CTE -------------------------------------------- ,Hierarchy AS ( -- Anchor SELECT ID ,Name ,MgrID ,nLevel = 1 ,Family = ROW_NUMBER() OVER (ORDER BY Name) FROM Employee WHERE MgrID IS NULL UNION ALL -- Recursive query SELECT E.ID ,E.Name ,E.MgrID ,H.nLevel+1 ,Family FROM Employee E JOIN Hierarchy H ON E.MgrID = H.ID ) SELECT * FROM Hierarchy ORDER BY Family, nLevel

Endnu en sql med træstruktur

SELECT ID,space(nLevel+
                    (CASE WHEN nLevel > 1 THEN nLevel ELSE 0 END)
                )+Name
FROM Hierarchy
ORDER BY Family, nLevel
 


  1. Ret Msg 8114 "Fejl ved konvertering af datatype varchar til numerisk" i SQL Server

  2. Eksempler på formatering af 'datetime offset' i SQL Server ved hjælp af Standard Format Strings (T-SQL)

  3. Brug af SQL til at bestemme ordtællingsstatistikker for et tekstfelt

  4. jQuery UI Sorterbar, og skriv derefter rækkefølge i en database