当前位置: 代码迷 >> Sql Server >> SQL 多级品种查询
  详细解决方案

SQL 多级品种查询

热度:52   发布时间:2016-04-24 09:03:54.0
SQL 多级类别查询
CREATE TABLE tb
(
    ID INT PRIMARY KEY,
    strName VARCHAR(40) NOT NULL,
    ParentID INT DEFAULT(0)
)
go
insert into tb(ID,strName,ParentID)
select 1,'广东',0 union
select 2,'广西',0 union
select 3,'广州市',1 union
select 4,'深圳市',1 UNION
select 5,'南宁市',2 union
select 6,'柳州市',2 UNION
select 7,'天河区',3 union
select 8,'白云区',4 UNION
select 9,'青秀区',5 union
select 10,'江南区',5 

如何得到下面结果:
ID 类1        类2          类3
1 广东
2 广西
3 广东 广州市
4 广东 深圳市
5 广西 南宁市
6 广西 柳州市
7 广东 广州市 天河区
8 广东 广州市 白云区
9 广西 南宁市 青秀区
10 广西 南宁市 江南区


------解决思路----------------------
;WITH CTE AS(
SELECT ID,strName,ParentID
,1 DEEP
,'-'+CAST(ID AS VARCHAR(8000))+'-'IDPath
FROM tb
WHERE ParentID=0
UNION ALL
SELECT T1.ID,T1.strName,T1.ParentID
,T2.DEEP+1
,T2.IDPath+'-'+CAST(T1.ID AS VARCHAR(8000))+'-'
FROM tb T1
JOIN CTE T2 ON T1.ParentID=T2.ID
)
SELECT T0.ID
,ISNULL(T1.strName,'')[类1]
,ISNULL(T2.strName,'')[类2]
,ISNULL(T3.strName,'')[类3]
FROM CTE T0
 LEFT JOIN CTE T1 ON T1.DEEP=1 AND T0.IDPath LIKE T1.IDPath+'%'
 LEFT JOIN CTE T2 ON T2.DEEP=2 AND T0.IDPath LIKE T2.IDPath+'%'
 LEFT JOIN CTE T3 ON T3.DEEP=3 AND T0.IDPath LIKE T3.IDPath+'%'
  相关解决方案