数据层级显示(根据代码级次显示名称)
2010-04-28 18:32
555 查看
问题贴:http://topic.csdn.net/u/20100428/14/51caf51d-bfc7-4832-9783-2805e13085e5.html?11679
--------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-04-28 14:48:10
-- Version:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
-- Blog : http://blog.csdn.net/htl258 -- Subject: 数据层级显示(根据代码级次显示名称)
--------------------------------------------------------------------------
--> 生成测试数据表:tb
IF NOT OBJECT_ID('[tb]') IS NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb](GUID INT IDENTITY,[col1] NVARCHAR(10),[col2] NVARCHAR(20))
INSERT [tb]
SELECT N'A','01' UNION ALL
SELECT N'B','01.01' UNION ALL
SELECT N'C','01.01.01' UNION ALL
SELECT N'F','01.01.01.01' UNION ALL
SELECT N'E','01.01.01.02' UNION ALL
SELECT N'D','01.01.01.03' UNION ALL
SELECT N'O','02' UNION ALL
SELECT N'P','02.01' UNION ALL
SELECT N'Q','02.01.01'
GO
--SELECT * FROM [tb]
-->SQL查询如下:
--BY:TONY
;WITH T AS
(
SELECT *,PATH=CAST([COL1] AS VARCHAR(1000)) FROM TB A
WHERE NOT EXISTS(
SELECT 1 FROM TB
WHERE A.COL2 LIKE COL2+'%'
AND LEN(A.COL2)>LEN(COL2))
UNION ALL
SELECT A.*,CAST(PATH+'-->'+A.COL1 AS VARCHAR(1000))
FROM TB A
JOIN T B
ON A.COL2 LIKE B.COL2+'%'
AND LEN(A.COL2)-3=LEN(B.COL2)
)
SELECT * FROM T ORDER BY LEFT(COL2,2)
/*
GUID COL1 COL2 PATH
----------- ---------- -------------------- --------------------
1 A 01 A
2 B 01.01 A-->B
3 C 01.01.01 A-->B-->C
4 F 01.01.01.01 A-->B-->C-->F
5 E 01.01.01.02 A-->B-->C-->E
6 D 01.01.01.03 A-->B-->C-->D
7 O 02 O
8 P 02.01 O-->P
9 Q 02.01.01 O-->P-->Q
(9 行受影响)
*/
--BY:LDSLOVE
;WITH T AS
(
SELECT *,CAST(COL1 AS VARCHAR(1000)) AS PATH
FROM TB
WHERE COL2 NOT LIKE '%.%'
UNION ALL
SELECT A.*,CAST(B.PATH+'-->'+A.COL1 AS VARCHAR(1000))
FROM TB A,T B
WHERE A.COL2 LIKE B.COL2+'.[01-99][01-99]'
)
SELECT *
FROM T
ORDER BY LEFT(COL2,2)
/*
GUID COL1 COL2 PATH
----------- ---------- -------------------- --------------------
1 A 01 A
2 B 01.01 A-->B
3 C 01.01.01 A-->B-->C
4 F 01.01.01.01 A-->B-->C-->F
5 E 01.01.01.02 A-->B-->C-->E
6 D 01.01.01.03 A-->B-->C-->D
7 O 02 O
8 P 02.01 O-->P
9 Q 02.01.01 O-->P-->Q
(9 行受影响)
*/
--BY:NIANRAN520
SELECT T.*,
REPLACE(STUFF(
(SELECT ','+COL1 FROM TB
WHERE CHARINDEX('.'+COL2+'.','.'+T.COL2+'.') > 0
FOR XML PATH('')),1,1,''),',','-->') AS ITEM
FROM TB T
/*
GUID COL1 COL2 PATH
----------- ---------- -------------------- --------------------
1 A 01 A
2 B 01.01 A-->B
3 C 01.01.01 A-->B-->C
4 F 01.01.01.01 A-->B-->C-->F
5 E 01.01.01.02 A-->B-->C-->E
6 D 01.01.01.03 A-->B-->C-->D
7 O 02 O
8 P 02.01 O-->P
9 Q 02.01.01 O-->P-->Q
(9 行受影响)
*/
--------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-04-28 14:48:10
-- Version:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
-- Blog : http://blog.csdn.net/htl258 -- Subject: 数据层级显示(根据代码级次显示名称)
--------------------------------------------------------------------------
--> 生成测试数据表:tb
IF NOT OBJECT_ID('[tb]') IS NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb](GUID INT IDENTITY,[col1] NVARCHAR(10),[col2] NVARCHAR(20))
INSERT [tb]
SELECT N'A','01' UNION ALL
SELECT N'B','01.01' UNION ALL
SELECT N'C','01.01.01' UNION ALL
SELECT N'F','01.01.01.01' UNION ALL
SELECT N'E','01.01.01.02' UNION ALL
SELECT N'D','01.01.01.03' UNION ALL
SELECT N'O','02' UNION ALL
SELECT N'P','02.01' UNION ALL
SELECT N'Q','02.01.01'
GO
--SELECT * FROM [tb]
-->SQL查询如下:
--BY:TONY
;WITH T AS
(
SELECT *,PATH=CAST([COL1] AS VARCHAR(1000)) FROM TB A
WHERE NOT EXISTS(
SELECT 1 FROM TB
WHERE A.COL2 LIKE COL2+'%'
AND LEN(A.COL2)>LEN(COL2))
UNION ALL
SELECT A.*,CAST(PATH+'-->'+A.COL1 AS VARCHAR(1000))
FROM TB A
JOIN T B
ON A.COL2 LIKE B.COL2+'%'
AND LEN(A.COL2)-3=LEN(B.COL2)
)
SELECT * FROM T ORDER BY LEFT(COL2,2)
/*
GUID COL1 COL2 PATH
----------- ---------- -------------------- --------------------
1 A 01 A
2 B 01.01 A-->B
3 C 01.01.01 A-->B-->C
4 F 01.01.01.01 A-->B-->C-->F
5 E 01.01.01.02 A-->B-->C-->E
6 D 01.01.01.03 A-->B-->C-->D
7 O 02 O
8 P 02.01 O-->P
9 Q 02.01.01 O-->P-->Q
(9 行受影响)
*/
--BY:LDSLOVE
;WITH T AS
(
SELECT *,CAST(COL1 AS VARCHAR(1000)) AS PATH
FROM TB
WHERE COL2 NOT LIKE '%.%'
UNION ALL
SELECT A.*,CAST(B.PATH+'-->'+A.COL1 AS VARCHAR(1000))
FROM TB A,T B
WHERE A.COL2 LIKE B.COL2+'.[01-99][01-99]'
)
SELECT *
FROM T
ORDER BY LEFT(COL2,2)
/*
GUID COL1 COL2 PATH
----------- ---------- -------------------- --------------------
1 A 01 A
2 B 01.01 A-->B
3 C 01.01.01 A-->B-->C
4 F 01.01.01.01 A-->B-->C-->F
5 E 01.01.01.02 A-->B-->C-->E
6 D 01.01.01.03 A-->B-->C-->D
7 O 02 O
8 P 02.01 O-->P
9 Q 02.01.01 O-->P-->Q
(9 行受影响)
*/
--BY:NIANRAN520
SELECT T.*,
REPLACE(STUFF(
(SELECT ','+COL1 FROM TB
WHERE CHARINDEX('.'+COL2+'.','.'+T.COL2+'.') > 0
FOR XML PATH('')),1,1,''),',','-->') AS ITEM
FROM TB T
/*
GUID COL1 COL2 PATH
----------- ---------- -------------------- --------------------
1 A 01 A
2 B 01.01 A-->B
3 C 01.01.01 A-->B-->C
4 F 01.01.01.01 A-->B-->C-->F
5 E 01.01.01.02 A-->B-->C-->E
6 D 01.01.01.03 A-->B-->C-->D
7 O 02 O
8 P 02.01 O-->P
9 Q 02.01.01 O-->P-->Q
(9 行受影响)
*/
相关文章推荐
- 数据层级显示(根据代码级次显示名称)
- 数据层级显示(根据代码级次显示名称)
- 数据层级显示(根据代码级次显示名称)
- layui 数据表格 根据值(1=业务,2=机构)显示中文名称
- 在拼接的字符串中根据代码显示名称
- 根据名称分组,选择最大日期和最小日期的数据,并显示在一行上
- 根据拼音或名称联动显示符合条件的数据
- layui 数据表格 根据值(1=业务,2=机构)显示中文名称
- 根据记录分组、将数据动态纵向显示
- EMAP开发时创建页面模型后,根据模型中查询动作生成页面模板,没有数据显示
- TableView 根据数据显示分割线
- 根据ajax从服务器获取数据的时间和ID,根据最近的时间,显示一个记录重复ID的数字
- Android 根据EditText搜索框ListView动态显示数据
- A表中的数据根据条件,不能再B表中存在,显示A表符合条件的数据
- 应用开发框架之——根据数据表中的存储的方法名称来调用方法
- CTE递归应用,树状结构,查询所有子部门、子部门数量、按层级显示部门名称
- 解决使用Vue.js显示数据的时,页面闪现原始代码
- iOS根据坐标数据点所在的坐标区域来动态显示到可视范围
- SQL语句增加虚拟字段,并根据情况显示不同的数据。。。(已阅。。。未阅。。)
- VB.NET中根据DataGridView中显示的数据条件数据行显示不同的颜色