2015-09-06 83 views
-1

我有一个多级层次结构数据。 我想使用sql查询将所有内容组合成两个级别。 我想返回数据SQL查询-N级别层次结构 - 仅返回父级和最后一个子级

PID  CId  Name 
Null 1  Electronics 
1  2  Laptop 
2  3  Toshiba 
1  4  Mobile 
4  5  Samsung 

首先父母和最后一个孩子,我需要这样的

PID  CId  Name 
Null 1  Electronics 
1  3  Toshiba 
1  5  Samsung 

回答

0

结果使用此tutorial创建我第一递归CTE只为你。

这里的诀窍是用空标记该行作为BigBoss并将该值传递给递归部分。

最后where有两个过滤器

  • PID IS NULL展现父亲项。
  • OR NOT EXISTS显示项目没有儿童

SQL Fiddle Demo
小提琴显示你的愿望输出,但如果你unncoment的代码,你可以看到完整的结果,以便更好地理解。

WITH DirectReports (PID, CId, Name, Level, BigBoss) 
AS 
(
    -- Anchor member definition 
    SELECT e.PID, e.CId, e.Name, 0 AS Level, e.CId BigBoss 
    FROM dbo.Table1 AS e 
    WHERE e.PID IS NULL 
    UNION ALL 
    -- Recursive member definition 
    SELECT e.PID, e.CId, e.Name, Level + 1, d.BigBoss 
    FROM dbo.Table1 AS e 
    INNER JOIN DirectReports AS d 
     ON e.PID = d.CId 
) 
-- Statement that executes the CTE 
-- SELECT d.PID, d.CId, d.Name, d.Level, d.BigBoss 
-- FROM DirectReports d 
SELECT CASE 
      WHEN PID IS NULL THEN NULL 
      ELSE BigBoss 
     END PID, 
     Cid, Name 
FROM DirectReports 
WHERE 
    PID IS NULL 
OR NOT EXISTS (SELECT * 
       FROM Table1 t 
       WHERE d.CId = t.PID) 

结果:

| PID | Cid |  Name | 
|--------|-----|-------------| 
| (null) | 1 | Electronics | 
|  1 | 5 |  Samsung | 
|  1 | 3 |  Toshiba | 
+0

更新我的答案使用递归CTE。现在回到你想要的精确输出。 –

相关问题