50分,关于 SQL Server 2005中递归查询的写法 的疑问!

liyanmingkong 2009-02-18 10:17:01
在网上找到 SQL Server 2005中递归查询的写法

with myT2 as(
select * from 表名 Where 根节点查询条件
union all
select 表名.* from myT2 inner join 表名 on myT2.ID=表名.ParentID)
select * from myT2

这种写法能直接在查询分析器里面,直接进行查询吗?

为什么我修改之后提示错误说 with 附近有语法错误!
...全文
130 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
claro 2009-02-18
  • 打赏
  • 举报
回复
帮顶。
dawugui 2009-02-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liyanmingkong 的回复:]
解决了,谢谢大家,以下是原因

可能你的数据引擎不是2005的
而是2000的
2000不支持此语法
select @@version 看看
[/Quote]
2000不支持.

2005才支持.
liyanmingkong 2009-02-18
  • 打赏
  • 举报
回复
解决了,谢谢大家,以下是原因

可能你的数据引擎不是2005的
而是2000的
2000不支持此语法
select @@version 看看
Roc_Lee 2009-02-18
  • 打赏
  • 举报
回复

;with myT2 as(
select * from 表名 Where 根节点查询条件
union all
select 表名.* from myT2 inner join 表名 on myT2.ID=表名.ParentID)
select * from myT2



一楼搞错了。测试了下,估计是with前应该加;号
dawugui 2009-02-18
  • 打赏
  • 举报
回复
2005中获取该节点及其所有子节点的方法。(小梁)

--> 生成测试数据: @T
DECLARE @T TABLE (BOM_NO INT,PRD_NO INT,NAME VARCHAR(5))
INSERT INTO @T
SELECT 123456,1234561,'测试1' UNION ALL
SELECT 123456,1234562,'测试2' UNION ALL
SELECT 1234561,1234563,'测试3' UNION ALL
SELECT 1234561,1234564,'测试4' UNION ALL
SELECT 123458,1234581,'测试5' UNION ALL
SELECT 123459,1234591,'测试6' UNION ALL
SELECT 123459,1234592,'测试7' UNION ALL
SELECT 1234564,12345641,'测试8'

--SQL查询如下:

DECLARE @BOM_NO INT
SET @BOM_NO=123456

;WITH Liang AS
(
SELECT
BOM_NO,PRD_NO,NAME,PATH=CAST(NAME AS VARCHAR(MAX))
FROM @T
WHERE BOM_NO=@BOM_NO
UNION ALL
SELECT
A.BOM_NO,
A.PRD_NO,
A.NAME,
B.PATH+'->'+A.NAME
FROM @T AS A
JOIN Liang AS B
ON A.BOM_NO=B.PRD_NO
)
SELECT *
FROM Liang

/*
BOM_NO PRD_NO NAME PATH
----------- ----------- ----- ---------------------------------------
123456 1234561 测试1 测试1
123456 1234562 测试2 测试2
1234561 1234563 测试3 测试1->测试3
1234561 1234564 测试4 测试1->测试4
1234564 12345641 测试8 测试1->测试4->测试8

(5 行受影响)
*/
dawugui 2009-02-18
  • 打赏
  • 举报
回复
--使用SQL Server 2005中的CTE处理树形数据

CREATE FUNCTION [f_pid](@id int)
RETURNS TABLE
AS
RETURN(
WITH ptb([id],[level])
AS(
SELECT [pid],1 FROM [tb]
WHERE [id]=@id
AND [pid] <>0
UNION ALL
SELECT A.[pid],B.[level]+1
FROM [tb] A,ptb B
WHERE A.[id]=B.[id]
AND [pid] <>0)
SELECT * FROM ptb
)
GO

--调用(查询所有的父)
SELECT A.*,层次=B.[level]
FROM [tb] A,[f_pid](7)B
WHERE A.[id]=B.[id]
GO
Roc_Lee 2009-02-18
  • 打赏
  • 举报
回复

with myT3 as(
select * from 表名 Where 根节点查询条件
union all
select 表名.* from myT2 inner join 表名 on myT2.ID=表名.ParentID)
select * from myT3




with的表名 和你 递归的那个表名重复了
lzfrab 2009-02-18
  • 打赏
  • 举报
回复
此属于CTE
2005新增的

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧