关系表递归查询的问题

f231283608 2015-11-04 03:34:54
有3个表:
表1是TAG类型表,有字段ID和NAME,ParentID三个字段,树形结构
表2是DataDic内容表
表3是TagDic关系表,有ID,DataDicID,TagID三个字段,表2和表1是1对多的关系。

现在页面有个表2的表格,点击表格某行可以获取到该行的DataDic的ID,要查询对应的所有标签信息,并且输出表1的完整标签嵌套信息(包含所有父节点)。

如果只是输出表1的标签名,而不需要所有父节点信息,可以:
select * ,(select TagName from Tag where ID=td.TagID) TagName,(select CNName from DataDic where ID=td.DataDicID) CNName from TagDic td
或者
select *,(select CNName from DataDic where ID=td.DataDicID) CNName from TagDic td,tag where tag.id=td.tagid

如果只是要查询某个ID的完整标签嵌套信息(包含所有父节点):
with cte(id,parentid,tagname)
as
(select id,parentid,tagname from tag where id=12
union all
select t.id,t.parentid,t.tagname from tag as t
inner join cte as c on c.parentid=t.id
)
select tagname+'-' from cte for xml path('')

但是这一截没法放到子查询里面去,求解,现在暂时只能先用前面的语句先查询出来一个DataTable,然后在C#代码里循环,把TagID取出来重新进行后面的查询。
有办法能用SQL语句一次性写完吗?如果不用存储过程
...全文
106 点赞 收藏 3
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Tiger_Zhao 2015-11-12
把完整的树从根开始遍历出来,就可以直接用id关联了。
;WITH cte(id,parentid,tagname)AS(
select id,
parentid,
CONVERT(nvarchar(100),tagname) tagname
from tag
where parentid=0
union all
select t.id,
t.parentid,
CONVERT(nvarchar(100),t.tagname+'-'+p.tagname) tagname
from tag as t
join cte as p
on t.parentid=p.id
)
select *,
(select CNName from DataDic where ID=td.DataDicID) CNName
from TagDic td, cte
where cte.id=td.tagid
回复
f231283608 2015-11-12
谁能让我结贴吗。。。
回复
f231283608 2015-11-04
另外问下后面的with as 语句,是从子节点往父节点查询的,输出也是从子节点往父节点输出(类型13-类型12-类型1-全部-),有没有办法从父节点往子节点输出,不能用ID或parentid倒序,不可靠。
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2015-11-04 03:34
社区公告
暂无公告