sqlserver 树形结构表查询 获取拼接结果

树形表结构如下

IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N‘[dbo].[Test]‘) AND type IN (‘U‘))
    DROP TABLE [dbo].[Test]
GO

CREATE TABLE [dbo].[Test] (
  [Id] bigint  IDENTITY(1,1) NOT NULL,
  [TypeName] nvarchar(50) COLLATE Chinese_PRC_CI_AS  NOT NULL,
  [ParentId] bigint  NULL
)
GO

-- ----------------------------
-- Records of Test
-- ----------------------------
SET IDENTITY_INSERT [dbo].[Test] ON
GO

INSERT INTO [dbo].[Test] ([Id], [TypeName], [ParentId]) VALUES (N‘1‘, N‘生活常识‘, N‘0‘)
GO

INSERT INTO [dbo].[Test] ([Id], [TypeName], [ParentId]) VALUES (N‘2‘, N‘生活‘, N‘1‘)
GO

INSERT INTO [dbo].[Test] ([Id], [TypeName], [ParentId]) VALUES (N‘3‘, N‘常识‘, N‘2‘)
GO

SET IDENTITY_INSERT [dbo].[Test] OFF
GO

表结构及数据

需要实现的结果

对于这种情况有三种解决方案:游标、循环、CTE

一、游标、循环

DECLARE @temp nvarchar(MAX)=‘‘,@pid bigint=3;
WHILE @pid<>0
BEGIN IF @temp=‘‘
    SELECT @temp=TypeName,@pid=ParentId
    FROM [dbo].[Test]
    WHERE Id=@pid;
ELSE
    SELECT @temp=(TypeName+‘->‘+@temp),@pid=ParentId
    FROM [dbo].[Test]
    WHERE Id=@pid;
END;
SELECT @temp AS TypeName;

二、CTE

;with Tree as
(
select * from [Test] where Id=3
union all
select a.* from [Test] a join Tree b on a.Id=b.ParentId
)
select stuff((select ‘->‘ + TypeName from Tree order by Id FOR XML PATH(‘‘)),1,5,‘‘)

CTE语法

;[ WITH [ ,n ] ] ::=
expression_name [ ( column_name [ ,n ] ) ]
AS
( CTE_query_definition )

在使用CTE时应注意如下几点: 
1、CTE后面必须直接跟使用CTE的SQL语句(如select、insert、update等),否则,CTE将失效。

2、CTE后面也可以跟其他的CTE,但只能使用一个with,多个CTE中间用逗号(,)分隔,如下

;with
cte1 as
(
    select * from table1 where name like ‘abc%‘
),
cte2 as
(
    select * from table2 where id > 20
),
cte3 as
(
    select * from table3 where price < 100
)
select a.* from cte1 a, cte2 b, cte3 c where a.id = b.id and a.id = c.id

3、如果CTE的表达式名称与某个数据表或视图重名,则紧跟在该CTE后面的SQL语句使用的仍然是CTE,当然,后面的SQL语句使用的就是数据表或视图了,如下

--  table1是一个实际存在的表

;with
table1 as
(
    select * from persons where age < 30
)
select * from table1  --  使用了名为table1的公共表表达式
select * from table1  --  使用了名为table1的数据表

4、CTE 可以引用自身,也可以引用在同一 WITH 子句中预先定义的 CTE。不允许前向引用。

5、不能在 CTE_query_definition 中使用以下子句: 
(1)COMPUTE 或 COMPUTE BY 
(2)ORDER BY(除非指定了 TOP 子句) 
(3)INTO 
(4)带有查询提示的 OPTION 子句 
(5)FOR XML 
(6)FOR BROWSE

6、如果将 CTE 用在属于批处理的一部分的语句中,那么在它之前的语句必须以分号结尾,

参考链接

原文地址:https://www.cnblogs.com/GoCircle/p/9442387.html

时间: 2024-07-30 16:33:15

sqlserver 树形结构表查询 获取拼接结果的相关文章

树形结构表查询,只用一条SQL语句查询所有父级ID解决办法

在树形结构表查询中用得最多的就是查询指定分类的所有下级分类,这个性能比较好的解决方案是为分类加一个编码(路径)把父级的ID都拼接上,最后通过like 'x%'就能把所有下级分类select出来.但是有时也会遇到反过来,找出指定分类的所有上级分类,这个情况尤其在分销或类传销的系统中最常见,因为他们分成都是上级分成,所以要找出指定人的上级集合. 下面分享一下我的解决方案(只用一条SQL语句.不用存储过程.函数): 有下面所在的新闻分类表. ParentID为父级的ID. 下面要找出ID为52的所有上

Atitit.各种 数据类型 ( 树形结构,表形数据 ) 的结构与存储数据库 attilax 总结

Atitit.各种  数据类型 ( 树形结构,表形数据  ) 的结构与存储数据库 attilax  总结 1. 数据结构( 树形结构,表形数据,对象结构 ) 1 2. 编程语言中对应的数据结构 java c# php ( Dic/Map      List    datatable ) 1 3. 数据库存储数据  1 4. 数据的表形显示( 多条记录 与单条记录 ) 2 5. ASP.NET 数据控件:GridView,DataList,Repeater ,DetailsView,FormVie

SQL批量更新具有树形结构表Path字段

如上图所示,需要更新该表中Path字段,如ID=14的Path值:-1,ID=17的Path值:-1.14,ID=20的Path值:-1.14.18.19 步骤1.创建函数 Create FUNCTION [dbo].[F_Org] ( @id int ) RETURNS TABLE AS RETURN ( with testTable as( select UpperID from Core_DeptInfo where ID=@id union all select Core_DeptInf

使用postgre数据库实现树形结构表的子-父级迭代查询,通过级联菜单简单举例

前言:开发常用的关系型数据库MySQL,mssql,postgre,Oracle,简单的增删改查的SQL语句都与标准SQL兼容,这个不用讲,那么对于迭代查询(不严格的叫法:递归查询)每种数据库都不一样,对于标准SQL语句支持最好的是mssql和postgre,这个不需多讲,我们只讲讲单表情况下的postgre如何通过迭代查询获取有层级关系的数据. 一.表结构举例 MENU表 ID VARCHAR2(32)     N   sys_guid()    节点idFENXID VARCHAR2(32)

「SQL归纳」树形结构表的存储与查询功能的实现——通过路径方法(非递归)

一.树形结构例子分析: 以360问答页面为例:http://wenda.so.com/c/ 我们通过观察URL,可以明确该页面的数据以树形结构存储,下面三块模块分别为: ①根节点 ②根节点的第一层子节点 ③为左侧所选择节点的下一层子节点 (图1) 该例简化的树形结构图如下: (图2) 我们不难发现,每当点击图1红框内的类别时,页面主体问题部分会显示该类别节点下所有子节点的问题.因此,需要实现查询出某节点所有子节点的功能. 二.表的存储: 需要存储两张表: 1.类别表 create table [

树形结构表的存储【转自:https://www.cnblogs.com/Tjna/p/9026980.html】

一.树形结构例子分析: 以360问答页面为例:http://wenda.so.com/c/ 我们通过观察URL,可以明确该页面的数据以树形结构存储,下面三块模块分别为: ①根节点 ②根节点的第一层子节点 ③为左侧所选择节点的下一层子节点 (图1) 该例简化的树形结构图如下: (图2) 我们不难发现,每当点击图1红框内的类别时,页面主体问题部分会显示该类别节点下所有子节点的问题.因此,需要实现查询出某节点所有子节点的功能. 二.表的存储: 需要存储两张表: 1.类别表 create table [

树形结构的数据库表Schema设计-基于左右值编码

树形结构的数据库表Schema设计 程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门.栏目结构.商品分类等等,通常而言,这些树状结构需要借助于数据库完 成持久化.然而目前的各种基于关系的数据库,都是以二维表的形式记录存储数据信息,因此是不能直接将Tree存入DBMS,设计合适的Schema及其对 应的CRUD算法是实现关系型数据库中存储树形结构的关键. 理想中树形结构应该具备如下特征:数据存储冗余度小.直观性强:检索遍历过程简单高效:节点增删改查CRUD操作高效.无意

sql树形结果,查询所有子类

新建测试表 CREATE TABLE [dbo].[test]( [Id] [bigint] IDENTITY(1,1) NOT NULL, [parentId] [bigint] NULL, [name] [nvarchar](50) NULL, [jb] [int] NULL,) GO 插入测试数据 INSERT INTO test ( Id, parentId, name, jb) values (1,0,'1',1);INSERT INTO test ( Id, parentId, na

Oracle--树形自关联表查询SQL

平时会经常用到自关联的树形结构表来存储树形结构的数据,数据之间的层次联系代表着树形结构中的父子关系,并通常用表中两个列间的联系来描述,如下表中ID 和 PARENT_ID,ID为家族成员编号,PARENT_ID为父母编号,从而可以形成一个树形结构的家族关系. 一.基本用法 基本语句:select ··· from ··· connect by prior ··· start with ··· order siblings by ··· 如家族树的表查询语句为: select * from fam