SqlServer里,如何一条sql进行递归删除?
我知道可以递归检索,如:
CREATE TABLE [aaa](
[id] [int] NULL,
[pid] [int] NULL,
[name] [nchar](10)
)
GO
INSERT INTO aaa VALUES(1,0,a)
INSERT INTO aaa VALUES(2,0,b)
INSERT INTO aaa VALUES(3,1,c)
INSERT INTO aaa VALUES(4,1,d)
INSERT INTO aaa VALUES(5,2,e)
INSERT INTO aaa VALUES(6,3,f)
INSERT INTO aaa VALUES(7,3,g)
INSERT INTO aaa VALUES(8,4,h)
GO
下面的Sql是查询出1结点的所有子结点
with my1 as(select * from aaa where id = 1
union all select aaa.* from my1, aaa where my1.id = aaa.pid
)
select * from my1
我现在想删除1结点和所有子结点,不想用存储过程
但是发现一条sql实现不了:
with my1 as(select * from aaa where id = 1
union all select aaa.* from my1, aaa where my1.id = aaa.pid
)
delete from my1
错误:派生表 'my1' 不可更新,因为其定义中包含 UNION 运算符。
delete from aaa where id in(
with my1 as(select * from aaa where id = 1
union all select aaa.* from my1, aaa where my1.id = aaa.pid
)
select * from my1
)
这个错误更多:
消息 156,级别 15,状态 1,第 2 行
关键字 'with' 附近有语法错误。
消息 319,级别 15,状态 1,第 2 行
关键字 'with' 附近有语法错误。如果此语句是公用表表达式或 xmlnamespaces 子句,那么前一个语句必须以分号结尾。
消息 102,级别 15,状态 1,第 6 行
')' 附近有语法错误。
CREATE TABLE [aaa](
[id] [int] NULL,
[pid] [int] NULL,
[name] [nchar](10)
)
GO
INSERT INTO aaa VALUES(1,0,a)
INSERT INTO aaa VALUES(2,0,b)
INSERT INTO aaa VALUES(3,1,c)
INSERT INTO aaa VALUES(4,1,d)
INSERT INTO aaa VALUES(5,2,e)
INSERT INTO aaa VALUES(6,3,f)
INSERT INTO aaa VALUES(7,3,g)
INSERT INTO aaa VALUES(8,4,h)
GO
下面的Sql是查询出1结点的所有子结点
with my1 as(select * from aaa where id = 1
union all select aaa.* from my1, aaa where my1.id = aaa.pid
)
select * from my1
我现在想删除1结点和所有子结点,不想用存储过程
但是发现一条sql实现不了:
with my1 as(select * from aaa where id = 1
union all select aaa.* from my1, aaa where my1.id = aaa.pid
)
delete from my1
错误:派生表 'my1' 不可更新,因为其定义中包含 UNION 运算符。
delete from aaa where id in(
with my1 as(select * from aaa where id = 1
union all select aaa.* from my1, aaa where my1.id = aaa.pid
)
select * from my1
)
这个错误更多:
消息 156,级别 15,状态 1,第 2 行
关键字 'with' 附近有语法错误。
消息 319,级别 15,状态 1,第 2 行
关键字 'with' 附近有语法错误。如果此语句是公用表表达式或 xmlnamespaces 子句,那么前一个语句必须以分号结尾。
消息 102,级别 15,状态 1,第 6 行
')' 附近有语法错误。
...全文
相关推荐
深入sql oracle递归查询
本篇文章是对sql oracle 递归查询进行了详细的分析介绍,需要的朋友参考下
使用FORFILES命令来删除SQLServer备份的批处理
利用这些参数可以构造下面的例子来解决你删除备份脚本文件的难题。你可以基于更改时间/日期或者备份类型来创建脚本。你甚至可以构造能够同时参照两种标准的脚本
本人收藏的mssql合集
本人收藏的一些mssql资料,包括isql命令参数、MS SQL的一些经典常用操作语句汇总、sql开发高级等
sqlserver另类非递归的无限级分类(存储过程版)
下面是我统计的几种方案: 第一种方案(递归式): 简单的表结构为: CategoryID int(4), CategoryName nvarchar(50), ParentID int(4), Depth int(4) 这样根据ParentID一级级的运用递归找他的上级目录。 还有可以为了方便添加CategoryLeft,CategoryRight保存他的上级目录或下级目录 第二种方案: 设置一个varchar类型的CategoryPath字段来保存目录的完整路径,将父目录id用符号分隔开来。比如:1,5,8,10 第三种方案: 每级分类递增两位数字的方法 示例: 一级分类:01,02,03,
mssql存储过程用法.txt
mssql存储过程用法


疑难问题
