Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да проектирам SQL рекурсивна заявка?

Вижте:

Актуализация:

Правилният рекурсивен CTE се състои основно от три неща:

  • анкерната SELECT да започнем с; който може да избере напр. служителите на основно ниво (където Reports_To е NULL), или може да избере произволен служител, който дефинирате, напр. по параметър

  • a UNION ALL

  • рекурсивен SELECT израз, който избира от същата, обикновено самореферентна таблица и се свързва с рекурсивния CTE, който се изгражда в момента

Това ви дава възможност рекурсивно да изградите набор от резултати, от който след това да избирате.

Ако погледнете Northwind примерна база данни, тя има таблица, наречена Employees който се самореферира:Employees.ReportsTo --> Employees.EmployeeID определя кой на кого докладва.

Вашият CTE ще изглежда така:

;WITH RecursiveCTE AS
(
    -- anchor query; get the CEO
    SELECT EmployeeID, FirstName, LastName, Title, 1 AS 'Level', ReportsTo
    FROM dbo.Employees
    WHERE ReportsTo IS NULL

    UNION ALL

    -- recursive part; select next Employees that have ReportsTo -> cte.EmployeeID      
    SELECT 
       e.EmployeeID, e.FirstName, e.LastName, e.Title, 
       cte.Level + 1 AS 'Level', e.ReportsTo
    FROM 
       dbo.Employees e
    INNER JOIN 
       RecursiveCTE cte ON e.ReportsTo = cte.EmployeeID
)
SELECT *
FROM RecursiveCTE
ORDER BY Level, LastName    

Не знам дали можете да преведете извадката си в правилен рекурсивен CTE - но това е основното:заявка за закрепване, UNION ALL, рекурсивна заявка




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ограничение за саморефериране в MS SQL

  2. Вземете всичко за всеки служител?

  3. Получаване на разрешение за изпълнение на xp_cmdshell

  4. Как да използвате курсора за актуализиране на запис

  5. Вмъкване на масив от байтове ВЪВ varbinary(max) запис