ORACLE Connect по выражению, эквивалентному в SQL Server - PullRequest
5 голосов
/ 04 февраля 2010

Есть ли эквивалентное условие для CONNECT BY Oracle в SQL Server. Требование для построения дерева категорий с использованием поля parentId.

Ответы [ 2 ]

8 голосов
/ 04 февраля 2010

SQL Server 2005+, эквивалентный синтаксису CONNECT BY Oracle, состоит в использовании рекурсивного CTE. SQL Server 2008 добавил HierarchyID . Вот пример рекурсивного CTE:

WITH EmployeeHierarchy (EmployeeID, LastName, FirstName, ReportsTo, HierarchyLevel) AS (
   SELECT EmployeeID,
          LastName,
          FirstName,
          ReportsTo,
          1 as HierarchyLevel
     FROM Employees
    WHERE ReportsTo IS NULL
   UNION ALL
   -- Recursive step
   SELECT e.EmployeeID,
          e.LastName,
          e.FirstName,
          e.ReportsTo,
          eh.HierarchyLevel + 1 AS HierarchyLevel
     FROM Employees e
     JOIN EmployeeHierarchy eh ON e.ReportsTo = eh.EmployeeID)
  SELECT *
    FROM EmployeeHierarchy
ORDER BY HierarchyLevel, LastName, FirstName 

Поиск в иерархии "иерархического CTE" и / или "рекурсивного CTE" приведет к многочисленным результатам. Я взял пример запроса с 4GuysFromRolla.com .

Рекурсивные CTE теперь являются стандартом ANSI - синтаксис не поддерживается до Oracle 11g, как я понимаю.

1 голос
/ 04 февраля 2010

Существует HierarchyID тип данных в MS SQL Server 2008, который может сделать вашу жизнь проще.

...