sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server CTE och rekursionsexempel

Jag har inte testat din kod, bara försökt hjälpa dig förstå hur den fungerar i kommentaren;

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 enklaste exemplet på en rekursiv CTE Jag kan tänka mig att illustrera dess funktion är;

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

F 1) hur värdet på N ökar. om värdet tilldelas till N varje gång kan N-värdet ökas men endast första gången N-värdet initierades .

A1: I det här fallet, N är inte en variabel. N är ett alias. Det är motsvarigheten till SELECT 1 AS N . Det är en syntax av personlig preferens. Det finns två huvudmetoder för aliasing av kolumner i en CTE i T-SQL . Jag har inkluderat analogen till en enkel CTE i Excel att försöka illustrera på ett mer bekant sätt vad som händer.

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

F 2) nu här om CTE och rekursion av medarbetarrelationer i det ögonblick jag lägger till två chefer och lägger till några fler anställda under den andra chefen sedan problemet startar. Jag vill visa första chefsdetalj och på nästa rader kommer bara de anställdas uppgifter att komma de som är underordnade den chefen

A2:

Svarar den här koden på din fråga?

--------------------------------------------
-- 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

Ännu en sql med trädstruktur

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


  1. Analysera röravgränsad sträng i kolumner?

  2. Hur man inte kallar Hekaton inbyggt kompilerade lagrade procedurer

  3. Hur man delar en sträng efter ett specifikt tecken i SQL Server och uppdaterar detta värde till en specifik kolumn

  4. SQL Server:Extrahera tabellmetadata (beskrivning, fält och deras datatyper)