Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak zaprojektować rekurencyjne zapytanie SQL?

Zobacz:

Aktualizacja:

Właściwe rekurencyjne CTE składa się z trzech rzeczy:

  • kotwica SELECT najpierw; które mogą wybrać m.in. pracownicy na poziomie głównym (gdzie Reports_To ma wartość NULL) lub może wybrać dowolnego określonego pracownika, np. przez parametr

  • a UNION ALL

  • rekurencyjny SELECT instrukcja, która wybiera z tej samej, zazwyczaj odwołującej się do siebie tabeli i łączy się z aktualnie budowanym rekurencyjnym CTE

Daje to możliwość rekursywnego tworzenia zestawu wyników, z którego można następnie wybierać.

Jeśli spojrzysz na Northwind przykładowa baza danych, zawiera tabelę o nazwie Employees który jest samoodnoszący się:Employees.ReportsTo --> Employees.EmployeeID określa kto komu podlega.

Twoje CTE wyglądałoby mniej więcej tak:

;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    

Nie wiem, czy możesz przetłumaczyć swoją próbkę na właściwe rekurencyjne CTE - ale to w zasadzie sedno:zapytanie zakotwiczające, UNION ALL, zapytanie rekurencyjne




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. com.microsoft.sqlserver.jdbc.SQLServerException:Wariant typu danych nie jest obsługiwany

  2. Łączenie aplikacji ASP.NET core z lokalną instancją SQLServer

  3. EF4 — wybrana procedura składowana nie zwraca żadnych kolumn

  4. Procedura lub funkcja !!! ma za dużo podanych argumentów

  5. Nieprawidłowa składnia w pobliżu „GO”