在sqlserver2005之前,要实现递归功能比较麻烦,比如可能会要用到临时表与while语句来循环。自sqlserver2005之后,新增了with as功能语法,即 公用表达式(CTE),让递归实现起来变的简单了。本章我们主要演示如何利用with as功能实现一个简单的递归功能。在这之前先看一下cte的语法: [ WITH <common_table_expression > [ ,...n ] ]<common_table_expression >::= expression_name [ ( column_name [ ,...n ] ) ] AS ...
create table Role_CTE (Id int not null,Name nvarchar(32) not null,ParentId int not null )insert into Role_CTE(Id,Name,ParentId) select ‘1‘,‘超级管理员‘,‘0‘ union select ‘2‘,‘管理员A‘,‘1‘ union select ‘3‘,‘管理员B‘,‘2‘ union select ‘4‘,‘会员AA‘,‘2‘ union select ‘5‘,‘会员AB‘,‘2‘ union select ‘6‘,‘会员BA‘,‘3‘ union select ‘7‘...
SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,CTE即公用表表达式 百度百科 公用表表达式(CTE),是一个在查询中定义的临时命名结果集将在from子句中使用它。每个CTE仅被定义一次(但在其作用域内可以被引用任意次),并且在该查询生存期间将一直生存。可以使用CTE来执行递归操作。创建的语法是: with <name of you cte>(<column names>) as( <actual query> ) select * from <name of your cte> 1、生成数据--菜单目...
递归查询 IF OBJECT_ID(‘DiGui‘,‘U‘) IS NOT NULL DROP TABLE DiGui CREATE TABLE DiGui( Id VARCHAR(50), ParentId VARCHAR(50) ) INSERT INTO dbo.DiGui( Id, ParentId ) select ‘第三层‘,‘第一层‘ union select ‘第二层‘,‘第一层‘ union select ‘第四层‘,‘第一层‘ union select ‘第十层‘,‘第二层‘ union select ‘第九层‘,‘第二层‘ union select ‘第八层‘,‘第五层‘ union select ‘第二十层‘,‘第四...
with用法 --可以这么理解with SQL语句变量或者叫临时表名 as(SQL语句 ) select * from SQL语句变量或者叫临时表名 --递归调用 with CTE as(select ZTBM_ID,ztbm_name,ParentId from TB_ZYM_ZTBM where ParentId is null or ParentId=‘‘union allselect a.ZTBM_ID,a.ztbm_name,a.ParentId from TB_ZYM_ZTBM a inner join CTE on a.ParentId=CTE.ZTBM_ID ) select * from CTE --此语句可以理解如下 --同上一个语句--最顶层 1select...
16) = 0 --会员卡号 AS BEGIN declare @p int; --查询唯一性结果 declare @sql nvarchar(1000); --拼接查询sql字串 set @sql=‘SELECT @p=n_teamlevel FROM t_user_basic WHERE s_code=‘ +@s_code; exec sp_executesql @sql,N‘@p AS int OUTPUT‘,@p OUTPUT; with cte( NodeID,n_user,s_code,s_introducer,n_teamlevel ) as(SELECT NodeID=hierarchyID::Parse(‘/1/‘),n_user,s_code,s_introducer,n_...
CTE 语句(适用于MSSQL2005以后版本) with cte_testNavi(Id,Name,Pid ) as ( --这是查询语句 SELECT Id,Name,Pid FROM Navi WHERE Name=‘汽车‘ union all --这是需要递归的部分,CTE 自身调用完成循环递归查找 SELECT a.Id,a.Name,a.Pid FROM Navi a INNER JOIN cte_testNavi b ON (a.Pid=b.Id) ) select * from cte_testNavi 2、查询每个商品分类中最贵的前两个商品SQL 表设计:SQL:--要求根据商品分类取出每个商品下最贵...
开门见山,首先说下遇到的问题:前期系统地区字典表中,每个省市县只存了本级名称,没存完整的字段。如:肥西县隶属安徽省合肥市,表中就存了一个肥西县。现有需求需要将完整字段显示,由于系统已在线上运营,无法做过多复杂修改,初步定的方案是在表中新追加一个字段,将字段补齐,一是方便修改,二是为了后期如果别的功能用到可以拿新字段使用,简化工作。 好了,问题已经明确,接下来就想想怎么解决问题了。也不是什么比较难得...
一,递归查询原理 CTE的递归查询必须满足三个条件:初始条件,递归调用表达式,终止条件,CTE 递归查询的伪代码如下:WITH cte_name ( column_name [,...n] ) AS ( --Anchor member is defined CTE_query_definition UNION ALL --Recursive member is defined referencing cte_name CTE_query_definition ) -- Statement using the CTE SELECT * FROM cte_name1,递归查询至少包含两个子查询:第一个子查询称作定点(Anchor)子查...
create table Role_CTE (Id int not null,Name nvarchar(32) not null,ParentId int not null )insert into Role_CTE(Id,Name,ParentId) select ‘1‘,‘超级管理员‘,‘0‘ union select ‘2‘,‘管理员A‘,‘1‘ union select ‘3‘,‘管理员B‘,‘2‘ union select ‘4‘,‘会员AA‘,‘2‘ union select ‘5‘,‘会员AB‘,‘2‘ union select ‘6‘,‘会员BA‘,‘3‘ union select ‘7‘...
目录记一次SqlServer骚操作——递归 创建一个测试表,并灌入一些数据 兼容MSSQL2008以下的版本 正向查找 反向查找MSSQL2008以后的版本 正向查找 反向查找记一次SqlServer骚操作——递归 ? 最进需要用到sql递归更新数据的问题,因为需要兼容Sql Server 2000的语法,所以在Sql Server2008前后有两种不同的写法,这里简单记录一下。 创建一个测试表,并灌入一些数据 CREATE TABLE Test (Id INT,PId int )INSERT INTO Test VALUES(1,nu...
INSERT INTO #countrySELECT ‘中国‘,‘中国‘,null union allSELECT ‘江苏‘,‘中国‘,null union allSELECT ‘南京‘,‘江苏‘,null union allSELECT ‘无锡‘,‘江苏‘,null union allSELECT ‘徐州‘,‘江苏‘,null union allSELECT ‘扬州‘,‘江苏‘,null union allSELECT ‘苏州‘,‘江苏‘,null union allSELECT ‘六合区‘,‘南京‘,null union allSELECT ‘江宁区‘,‘南京‘,null union allSELECT ‘浦口区‘,‘南京‘...
CTE:公用表达式Common Table Expression 是SQL SERVER 2005版本之后引入的一个特性; #填充测试数据 1、sql 1 Create table GroupInfo1([Id] int,[GroupName] nvarchar(50),[ParentGroupId] int)2 3 Insert GroupInfo14 5 select 0,‘某某大学‘,null union all6 7 select 1,‘外语学院‘,0 union all8 select 2,‘英语专业‘,1 union all9 select 3,‘日语专业‘,1 union all 10 select 4,‘英语专业一班‘,2 union all 11 selec...
CTE:公用表达式Common Table Expression 是SQL SERVER 2005版本之后引入的一个特性; #填充测试数据 1、sql 1 Create table GroupInfo([Id] int,[GroupName] nvarchar(50),[ParentGroupId] int)2 3 Insert GroupInfo4 5 select 0,‘某某大学‘,null union all6 7 select 1,‘外语学院‘,0 union all8 select 2,‘英语专业‘,1 union all9 select 3,‘日语专业‘,1 union all 10 select 4,‘英语专业一班‘,2 union all 11 select ...
test表 ID 地区ID Name 地区名称 Main_ID 地区所属上级ID Sign 地区等级 例如:福建-厦门-湖里 分别是 1,2,3 */ -- 建表 SELECT 1003 ID, ‘福建‘ Name, 0 Main_ID, 1 Sign INTO test union all SELECT 1050 , ‘福州‘ , 1003 , 2 union all SELECT 1051 , ‘厦门‘ , 1003 , 2 union ALL SELECT 1375 , ‘思明‘ ...