sql >> Database >  >> RDS >> Sqlserver

SQL Server CTE en recursie voorbeeld

Ik heb je code niet getest, ik heb alleen geprobeerd je te helpen begrijpen hoe deze werkt in een opmerking;

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

Het eenvoudigste voorbeeld van een recursieve CTE Ik kan bedenken om de werking ervan te illustreren:

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

Q 1) hoe de waarde van N wordt verhoogd. als de waarde elke keer aan N wordt toegewezen, kan de N-waarde worden verhoogd, maar alleen de eerste keer dat de N-waarde werd geïnitialiseerd .

A1: In dit geval N is geen variabele. N is een schuilnaam. Het is het equivalent van SELECT 1 AS N . Het is een syntaxis van persoonlijke voorkeur. Er zijn 2 hoofdmethoden voor het aliasen van kolommen in een CTE in T-SQL . Ik heb de analoog van een eenvoudige CTE . toegevoegd in Excel om te proberen op een meer vertrouwde manier te illustreren wat er gebeurt.

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

V 2) nu hier over CTE en recursie van werknemersrelatie op het moment dat ik twee managers toevoeg en nog een paar werknemers toevoeg onder de tweede manager, dan begint het probleem. Ik wil het eerste managerdetail weergeven en in de volgende rijen zullen alleen die werknemersgegevens komen degenen die ondergeschikt zijn aan die manager

A2:

Beantwoordt deze code uw vraag?

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

Nog een sql met boomstructuur

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


  1. Interval converteren naar minuten

  2. Inleiding tot native dynamische SQL in Oracle Database

  3. Afbeelding invoegen in BLOB Oracle 10g

  4. Aankondiging van repmgr 2.0RC2