2015-01-06 31 views
0

我有一個表以下簡化信息被稱爲套房,不幸的是我無法控制的SQL多個自聯接的列

id title   parentsuiteid 
1 test    NULL 
4 pay1    3 
5 pay2    3 
3 Bill Payments 2 
14 Vouchers   2 
15 Mini    2 
2 Site Tests  NULL 

我想有一個水平表示使用報告如

test 
Site tests Bill Payments pay1 
Site tests Bill Payments pay2 
Site tests Vouchers 
Site tests Mini 

我是用加入

select a.id,a.title,b.title,a.parentsuiteid from #temp2 a 
left outer join #temp2 b 
on a.id = b.parentsuiteid 

id title   title  parentsuiteid 
1 test   NULL   NULL 
4 pay1   NULL   3 
5 pay2   NULL   3 
3 Bill Payments pay1   2 
3 Bill Payments pay2   2 
14 Vouchers  NULL   2 
15 Mini   NULL   2 
2 Site Tests  Bill Payments NULL 
2 Site Tests  Vouchers  NULL 
2 Site Tests  Mini   NULL 

這個工程有兩個LEVE測試LS罰款,但我不能預測有多少水平,將來還會有,它似乎變得複雜起來有兩個以上

如何讓我的輸出看起來像+水平表示 - 5級?

+0

究竟什麼是你的問題? – maryjane

+0

編輯問題 – user2168435

+0

如果你有N個級別,那麼你需要一個遞歸的SQL查詢,也稱爲CTE。請參閱http://stackoverflow.com/questions/1757260/simplest-way-to-do-a-recursive-self-join-in-sql-server – jhilden

回答

4

試試這個:

SQL Fiddle

MS SQL Server 2008的架構設置

CREATE TABLE temp 
(
    ID int, 
    title VARCHAR(50), 
    parentsuiteid int null 
) 

INSERT INTO temp 
VALUES 
(1, 'test', NULL), 
(4, 'pay1',3), 
(5, 'pay2', 3), 
(3, 'Bill Payments', 2), 
(14, 'Vouchers', 2), 
(15, 'Mini', 2), 
(2, 'Site Tests', NULL) 

查詢1

;WITH recurs 
AS 
(
    SELECT ID, title, parentsuiteid, 0 as level 
    FROM Temp 
    WHERE parentsuiteid IS NULL 
    UNION ALL 
    SELECT t1.ID, CAST(t2.title + ' ' + t1.title as VARCHAR(50)), t1.parentsuiteid, t2.level + 1 
    FROM temp t1 
    INNER JOIN recurs t2 
     ON t1.parentsuiteid = t2.ID 
) 
SELECT title 
FROM Recurs r1 
WHERE NOT EXISTS (SELECT * from recurs r2 WHERE r2.parentsuiteid = r1.Id) 

Results

|       TITLE | 
|-------------------------------| 
|       test | 
|   Site Tests Vouchers | 
|    Site Tests Mini | 
| Site Tests Bill Payments pay1 | 
| Site Tests Bill Payments pay2 | 
+0

這很好 – user2168435

-2

您可以使用遞歸CTE的:

WITH EmpsCTE 
AS (
SELECT empid 
    ,mgrid 
    ,firstname 
    ,lastname 
    ,0 AS distance 
FROM HR.Employees 
WHERE empid = 9 

UNION ALL 

SELECT M.empid 
    ,M.mgrid 
    ,M.firstname 
    ,M.lastname 
    ,S.distance + 1 AS distance 
FROM EmpsCTE AS S 
INNER JOIN HR.Employees AS M ON S.mgrid = M.empid 
) 
SELECT empid 
,mgrid 
,firstname 
,lastname 
,distance 
FROM EmpsCTE; 

empid  mgrid  firstname lastname    distance 
----------- ----------- ---------- -------------------- ----------- 
9   5   Zoya  Dolgopyatova   0 
5   2   Sven  Buck     1 
2   1   Don  Funk     2 
1   NULL  Sara  Davis    3 
+3

此SQL不反映問題。如果你要複製和粘貼代碼,至少要使它與問題相關。 – Tanner

+0

我不想爲他提供確切的答案。這就是我提供一個例子的原因,以便他能夠按照他的要求對其進行修改和修改。 –

+1

如果您不想提供「確切答案」,您應該提供詳細的解釋。這是比幫助解釋更少的幫助。如果OP不理解該做什麼,那麼一個沒有解釋的簡單示例就不可能提供幫助。另一種選擇不是首先發布答案。 –