Sql学习第三天——SQL 关于CTE(公用表达式)的递归查询使用
--只有在查询定义中为所有结果列都提供了不同的名称时,列名称列表才是可选的。
insert into dbo.Co_ItemNameSet values(37,5,'制造费用')
insert into dbo.Co_ItemNameSet values(38,35,'原材料')
t_tree as
AS
CTE 的基本语法结构如下:
公用表表达式 (CTE) 具有一个重要的优点,那就是能够引用其自身,从而创建递归 CTE。递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达式。
COMPUTE 或 COMPUTE BYinsert into dbo.Co_ItemNameSet values(43,2,'管理费用子项')
ORDER BY(除非指定了 TOP 子句)
insert into dbo.Co_ItemNameSet values(41,36,'工资')
insert into dbo.Co_ItemNameSet values(40,35,'间辅材料')
--select * from person.CountryRegion --如果加上这句话后面用到cr将报错
)
操作1:先看看不用CTE递归操作的sql语句如下(需要真是的建两个表进行数据的存放和判断,非常麻烦):
(
select * from 表 where 字段 like @s
),
select a.* from cte1 a, cte2 b, cte3 c where a.id = b.id and a.id = c.id
WITH expression_name [ ( column_name [,...n] ) ]
select * from table3 where price < 100
复制代码 代码如下:
insert into dbo.Co_ItemNameSet values(3,0,'销售费用')
在使用CTE时应注意如下几点:insert into dbo.Co_ItemNameSet values(113,43,'管理费用子项的子项')
--给表插入数据
(
插入数据:
select * from table1 where name like '测试%'
insert into dbo.Co_ItemNameSet values(36,5,'人工')
)
------------------------------------操作------------------------------------
递归 CTE 可以极大地简化在 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句中运行递归查询所需的代码。在 SQL Server 的早期版本中,递归查询通常需要使用临时表、游标和逻辑来控制递归步骤流。
FOR XML[ItemName] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL
select * from t_tree
insert into dbo.Co_ItemNameSet values(2,0,'管理费用')
with

with
--查询数据
[ItemId] [int] NULL,
select * from 表名 where 条件
复制代码 代码如下:
declare @s nvarchar(3)INTO
cte1 as
) ON [PRIMARY]
cr as
查询插入的数据:
(
insert into dbo.Co_ItemNameSet values(42,36,'福利')
关于使用CTE(公用表表达式)的递归查询----SQL Server 2005及以上版本
复制代码 代码如下:
复制代码 代码如下:
set @s = '测试%'; -- 必须加分号题目需求是:查询ItemId=2及子节点,也就是管理费用和其下属所有节点的信息
insert into dbo.Co_ItemNameSet values(35,5,'材料')
复制代码 代码如下:
select * from table2 where id > 20cte2 as
FOR BROWSE
with
select * from cr
上面可能对with as说的有点儿啰嗦了,下面进入正题:
当某个查询引用递归 CTE 时,它即被称为递归查询。递归查询通常用于返回分层数据,例如:显示某个组织图中的雇员或物料清单方案(其中父级产品有一个或多个组件,而那些组件可能还有子组件,或者是其他父级产品的组件)中的数据。
( CTE_query_definition )cte3 as
)
),
--运行 CTE 的语句为:
2. CTE后面也可以跟其他的CTE,但只能使用一个with,多个CTE中间用逗号(,)分隔,如下面的SQL语句所示:
(
[ParentItemId] [int] NULL,
复制代码 代码如下:
CTE后面必须直接跟使用CTE的SQL语句(如select、insert、update等),否则,CTE将失效。如下面的SQL语句将无法正常使用CTE:
结果图:
4. CTE 可以引用自身,也可以引用在同一 WITH 子句中预先定义的 CTE。
CREATE TABLE [dbo].[Co_ItemNameSet](复制代码 代码如下:
insert into dbo.Co_ItemNameSet values(39,35,'主要材料')3. 如果CTE的表达式名称与某个数据表或视图重名,则紧跟在该CTE后面的SQL语句使用的仍然是CTE,当然,后面的SQL语句使用的就是数据表或视图。
复制代码 代码如下:
老规矩先建表(Co_ItemNameSet):
带有查询提示的 OPTION 子句
insert into dbo.Co_ItemNameSet values(5,0,'生产成本')
复制代码 代码如下:
insert into dbo.Co_ItemNameSet values(4,0,'财务费用')SELECT <column_list> FROM expression_name;
5. 不能在 CTE_query_definition 中使用以下子句:
(
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/sql/mssql/2942.shtml
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
SQL基本教程之行转列Pivo
时间:2021-01-20
-
region from hr.Employees union
时间:2021-01-20
-
有时候需要调整用户权限
时间:2021-01-19
-
(但使用 ORDER BY 子句并不
时间:2021-01-19
-
RAND()*10000)insert into Detail
时间:2021-01-19
-
OR 运算符:在两侧的查询
时间:2021-01-19
-
放假之前老大跟我提起了
时间:2021-01-19
-
数据库的运维计策剧本篇
时间:2021-01-19
热门文章
-
4.与聚合函数和 GROUP BY 子句有关的常见错
时间:2021-01-19
-
SQL Server安全(11/11):审核(Auditing)
时间:2021-01-09
-
sqlserver中查询横表变竖表的sql语句简析
时间:2020-12-08
-
SQL Server简单模式下误删除堆表记录恢复方
时间:2020-12-12
-
关于SQL Server查询语句的使用
时间:2020-12-13
-
MSSQL教程_mssql数据库教程_MSSQL基础教程_第
时间:2020-12-13
-
jdbc连接sql server数据库问题分析
时间:2020-12-10
-
详解SQL游标的用法
时间:2020-12-27
-
sql server 关于设置null的一些建议
时间:2020-12-28
-
mssql关于一个表格结构的另外一种显示(表
时间:2020-12-11
