2013-09-05 7 views
3

У меня есть таблица областей, в которой я хочу видеть дерево (таблица просто упорядочена как дерево), возможно ли это с помощью запросов sql-запросов, я попытался сделать это, используя self joins, но я не получил желаемый результат.Tree view using SQL Query

enter image description here

вид дерева что-то вроде этого

Indiv

  • Div1
    • Zon1
  • div2
    • zon2
  • div3
    • zon3

РЕДАКТИРОВАТЬ:

согласно предложению Чарльза Бретаны Я попробовал CTE в нижнем запросе, и это не дало мне желаемого результата.

WITH Emp_CTE (id, ParentID, name) 
AS (
SELECT id, ParentID, name 
FROM eQPortal_Region 
WHERE ParentID=0 
UNION ALL 
SELECT e.id, e.ParentID, e.name 
FROM eQPortal_Region e 
INNER JOIN Emp_CTE ecte ON ecte.id = e.ParentID 
) 
SELECT * 
FROM Emp_CTE 
GO 

Это результат .. что пошло не так?

InDiv1

  • Div1
  • Div2
  • div3
    • Zon3
    • Zon2
    • zon1
+0

что rdbms ?? Sql-сервер имеет общие выражения таблиц (CTE), которые могут это сделать. В противном случае вам нужно закодировать фиксированное заранее определенное количество уровней. Это нормально? –

+0

Да .. Microsoft SQL Server ..ok дайте мне проверить CTE вне .. Спасибо .. – Rafay

+0

CTE не помогло, пожалуйста, обратитесь к моему правлению – Rafay

ответ

3

Этот парень Maulik Dhorajia отвечает на вопрос, отлично ...

http://maulikdhorajia.blogspot.com/2012/06/sql-server-using-ctecommon-table.html

Сделано копия запроса ..

;WITH CTECompany 
AS 
(
    SELECT 
    ID, 
    ParentID, 
    Name , 
    0 AS HLevel, 
    CAST(RIGHT(REPLICATE('_',5) + CONVERT(VARCHAR(20),ID),20) AS VARCHAR(MAX)) AS OrderByField 
FROM Region 
WHERE ParentID = 0 

UNION ALL 

SELECT 
    C.ID, 
    C.ParentID, 
    C.Name , 
    (CTE.HLevel + 1) AS HLevel, 
    CTE.OrderByField + CAST(RIGHT(REPLICATE('_',5) + CONVERT(VARCHAR(20),C.ID),20) AS VARCHAR(MAX)) AS OrderByField 
FROM Region C 
INNER JOIN CTECompany CTE ON CTE.ID = C.ParentID 
WHERE C.ParentID IS NOT NULL 


) 

-- Working Example 
SELECT 
ID 
, ParentID 
, HLevel 
, Name 
, (REPLICATE('----' , HLevel) + Name) AS Hierachy 
FROM CTECompany 
ORDER BY OrderByField 
+1

+1 Для ответа Gr8. здесь [Demo] (http://sqlfiddle.com/#!3/6ff31/23) – Romesh

+1

Я пытался ответить за последние 2 часа. Но сам ОП нашел решение. – Romesh