SQL server 根据子级查询根父级
小编做惯了根据父级查子级,可是怎么也没想到有一天会遇到根据子级查根父级这种需求,小编起初想通过C#,但是小编最后并没有做到合适的方法,那小编只能通过SQL server的方式来解决了
推算历程一:
with cte(FieldID,ParentId,FieldName)
as
(--下级父项
select FieldID,ParentId,FieldName from IntellManuSchool_Field where FieldID in (1,10) --子级id
union all
--递归结果集中的父项
select t.FieldID,t.ParentId,t.FieldName from IntellManuSchool_Field as t
inner join cte as c on t.FieldID = c.ParentId)
select FieldID,ParentId,FieldName from cte where ParentId=0 group by FieldID,ParentId,FieldName order by FieldID asc
小编在网上查询很多后都会遇到该方法,小编使用该方法虽然查到的是正确的,但是此方法对连表查询并不友好,他需要定义一个变量,然后通过变量(子级)查询,却没办法直接连表查询所有的
推算历程二:
select child.FieldID as ChildFieldID,Parent.FieldID as ParentFieldID,
Parent.ParentId,Parent.FieldName as ParentName from IntellManuSchool_Field as Parent
inner join IntellManuSchool_Field as child on Parent.FieldID=child.ParentId
where Parent.ParentId=0
group by child.FieldID ,Parent.FieldID ,Parent.ParentId,Parent.FieldName--该方法已经可以查询所有子类对应父类的列表
小编查来查去居然查到了小编之前的一篇博客Sql server 同一张表中ID,Name,ParentID要求同时查出ID对应的Name,和ParentID对应的Name,并从中得到了启发,方式如上代码,不断的总结还是很好的,因为自己也不知道哪天又会遇到此类问题
下面是小编最后的关联,table逻辑很复杂,小编只是写了一个代替,由于一行数据最终存在含有两个一级类型的现象,所以需要通过stuff的方式实现
select * from table a left join
(SELECT PackegId,Title,Field,STUFF((SELECT ','+ParentName FROM (select PackegId,Title,Field,ParentName from IntellManuSchool_CoursePackage as a left join (select child.FieldID as ChildFieldID,Parent.FieldID as ParentFieldID,Parent.ParentId,Parent.FieldName as ParentName from IntellManuSchool_Field as Parent inner join IntellManuSchool_Field as child on Parent.FieldID=child.ParentId where Parent.ParentId=0 group by child.FieldID ,Parent.FieldID ,Parent.ParentId,Parent.FieldName ) as b on CHARINDEX(','+LTRIM(b.ParentFieldID)+',',','+a.Field+',')>0 or CHARINDEX(','+LTRIM(b.ChildFieldID)+',',','+a.Field+',')>0 group by PackegId,Title,Field,ParentName) as a WHERE PackegId=T.PackegId FOR XML PATH('')),1,1,'') AS ParentName FROM (select PackegId,Title,Field,ParentName from IntellManuSchool_CoursePackage as a left join (select child.FieldID as ChildFieldID,Parent.FieldID as ParentFieldID,Parent.ParentId,Parent.FieldName as ParentName from IntellManuSchool_Field as Parent inner join IntellManuSchool_Field as child on Parent.FieldID=child.ParentId where Parent.ParentId=0 group by child.FieldID ,Parent.FieldID ,Parent.ParentId,Parent.FieldName ) as b on CHARINDEX(','+LTRIM(b.ParentFieldID)+',',','+a.Field+',')>0 or CHARINDEX(','+LTRIM(b.ChildFieldID)+',',','+a.Field+',')>0 group by PackegId,Title,Field,ParentName) T GROUP BY PackegId,Title,Field
) i on a.PackegId = i.PackegId
where a.PackegId in (3,4,5,6,8,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,27,28,29,30,31,32,33,34,35,36,37,
38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,55,56,57,58,59,60,61,62,63,64,65,66,67,69,70,71,72,73,74,75,
76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,1103,1104)
顺便讲讲如何在存储过程中找找自己的错误代码问题技巧,首先通过print @theStr可以打印变量的值,当变量为SQL server语句时该方法还是屡试不爽的,再者通过exec 存储过程名 参数可以执行存储过程,两者结合找存储过程的报错问题就会效率很高
最近心得:作为一名全栈,小编真的是很累,忙完前台忙后台,忙完后台忙数据库,不管哪一种隔一段时间没写,再突然安排该需求时,小编就突然需要花一段时间才能适应,短则2-3天,长则5-6天,不过随着越做越多,小编觉得越到后面数据库永远都是最重要的内容,因为前端后端怎么实现的可以照搬照抄,而数据库越到后面就越是在和逻辑打交道,像极了高中数学考试
2022-08-19更新,小编今天又发现一种更简单的查询方法子查询
select a.PackegId,a.Title,a.Field,a.StarRating,isnull(b.StudyUserCount,0) as StudyUserCount,a.AddTime,
(SELECT STUFF((SELECT ',' + CONVERT(VARCHAR, FieldName)FROM IntellManuSchool_Field WHERE charindex(',' + ltrim(FieldID) + ',', ',' +(SELECT STUFF((SELECT ',' + CONVERT(VARCHAR, ParentId) FROM IntellManuSchool_Field WHERE charindex(',' + ltrim(FieldID) + ',', ',' + a.Field + ',') > 0 AND FieldType = 1 FOR XML PATH('')), 1, 1, '')) + ',') > 0 AND FieldType = 0 FOR XML PATH('')), 1, 1, '')) AS OneLevelField from IntellManuSchool_CoursePackage as a
今日心得:逻辑的美就在于,原理很简单,但是做起来却有千万般变化,谁能在看到需求后想到最合适的原理和逻辑去实现,并使用最简单的方法做出程序,谁就是开发最屌的
SQL server 根据子级查询根父级相关推荐
- delphi使用MS Sql Server数据库的分布式查询
目录 delphi使用MS Sql Server数据库的分布式查询 一.链接服务器 1.1.简单的链接服务器 1.2.含多数据库架构的全链接服务器 1.3.链接服务器的理论与总结 语法: 参数: 本系 ...
- 拨开云雾见日月:SQL Server 调优之查询存储
拨开云雾见日月:SQL Server 调优之查询存储 数据库调优一直都是大家觉得比较困难的事情,SQL Server提供了很多方便的工具帮助大家进行性能分析,这边介绍下SQL Server的性能调优的 ...
- sql server的跨库查询(简单实现)
sql server怎么跨库查询? 因为程序里建立连接时已经有了服务器和数据库, 库 connGZ.Provider="SQLOLEDB.1" ...
- sql server跨服务器修改数据,SQL Server跨数据库服务器查询和跨表更新的详细操作...
SQL Server数据库跨数据库服务器查询和跨表更新的相关知识是本文我们主要要介绍的内容,接下来我们就通过一个实例来介绍这一过程.实例是这样的:想实现的功能很简单, 在我的本地一个表用来保存省的信息 ...
- Sql Server 2005跨数据查询
在进行Sql Server 2005跨数据库查询时,有时会出现排序规则不一致,且选出来的内容是乱码的问题. 临时解决方法,将一个库中的表中的数据导入到另一个库中,将跨数据库查询变成同数据库查询. 转载 ...
- SQL server 第十章------模糊查询和聚合函数上机实践
SQL server 第十章------模糊查询和聚合函数 上机练习1 –查询住址在"山东"的学生姓名.电话.住址. create table student( Name nvar ...
- SQL Server中T-SQL语句查询使用的函数
SQL Server中T-SQL语句查询使用的函数 一,字符串函数 字符串函数用于对字符串数据进行处理,并返回一个字符串或数字. 函数名 描述 举例 CHARINDEX 用来寻找一个指定的字符串在另一 ...
- 子级绝对定位,父级相对定位的由来 --- CSS定位
CSS定位:将盒子定在某一个位置,所以定位也是在摆放盒子, 按照定位的方式移动盒子. 定位 = 定位模式 + 边偏移 . 定位模式用于指定一个元素在文档中的定位方式.边偏移则决定了该元素的最终位置. ...
- mysql查询所有父级及本身
查询所有父级及本身 SELECT T1.id,T1.name,T1.parentid,T2.sort FROM table T1 INNER JOIN (SELECT@id AS _id,(SELEC ...
最新文章
- 同一个IP不同端口号使用session失效
- 在Windows下编译FFmpeg详细说明
- ddr4 lpddr4区别_iFixit 拆解 iPhone 12 系列:仍使用 LPDDR4 内存 | 爱搞机
- wcg总决赛_关于总决赛
- C++ 之父讨厌比特币
- 微信小程序wx.showToast
- 十七条黄金定律!(心态是命运的控制塔)
- 获得邮件列表失败_邮件经常失败回弹很糟心?一定要知道这几个小知识
- SharePoint专家新闻轮转器WebPart----亲測力推之Web部件
- python遍历目录压缩文件夹_zip包含一个档案文件夹,如何使用Python获取存档中每个zip的注释?...
- 用 Python 分析某医院药品销售案例
- gitLab 修改文件夹名称
- [ASP调试]小旋风Web服务器使用
- Re5:读论文 TWAG: A Topic-guided Wikipedia Abstract Generator
- Scene(场景)的使用
- 将波旁威士忌的整洁Mixins提升到新的水平
- Function 函数式接口及应用
- Scratch中的坐标系
- 【fluent meshing】用面face选择工具只能选到体body怎么办?可能是因为导入的时候zone设置为body了
- nodejs 工作线程的基本使用(worker_threads)
热门文章
- 张飞比关羽还能打?一位酷爱三国的日本程序员,用NLP分析了武将们的战斗力...
- CVE-2020-3119 Cisco CDP 协议栈溢出漏洞分析
- java derby,Java内嵌数据库Derby环境配置
- ABLIC Inc.推出汽车用S-19192系列3-6芯串联电池监测IC
- 渗透测试实例指南---CSRF
- 《暗黑破坏神3》蓝贴:游戏引擎的来源
- 在Linux下安装邮件服务器Qmail(一)
- mysql数据库在线查看器_mysqlshow(数据库对象查看工具)
- 异常:Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046}
- uniapp蓝牙getBLEDeviceServices接口获取不了服务问题