SQL SERVER递归问题,大神请进~~~~急

sagehemu 2016-07-19 11:41:46
现在有一个族谱项目,族谱表的结构大概是这样:
CREATE TABLE [dbo].[azpxx](
[序号] [int] IDENTITY(1,1) NOT NULL,
[姓名] [varchar](50) NULL,
[性别] [varchar](50) NULL,
[辈分] [int] NULL,
[排行] [int] NULL,
[字辈] [varchar](50) NULL,
[所属人] [int] NULL,
[所属关系] [varchar](50) NULL,
CONSTRAINT [PK_azpxx] PRIMARY KEY CLUSTERED
(
[序号] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

其中【所属人】为父级序号
有个需求是要求输入一个人的姓名后(已定位,不会重复),找到该人,显示该人所属的直系父辈(上一代)一直到第一代,和该人所有的子代(即下属每一代的第一个儿子)其到最后无子嗣。
with cte as
(
select * from azpxx where 序号=210
union all
select a.* from azpxx a join cte b on b.所属人1=a.序号 where a.性别='男'
)
select * from cte order by 辈分

这样可以获取被查找人的所有直系父辈,如何获取所有子代呀?

SQL语句如何写?请大神指教~~~~在线等~
...全文
130 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sagehemu 2016-07-19
  • 打赏
  • 举报
回复
相反不行的,要求只显示第一个儿子及下级,也就是该人的第一个儿子,第一个儿子的第一个儿子,以此类推
--小F-- 2016-07-19
  • 打赏
  • 举报
回复
with cte as
 (
 select * from azpxx where 序号=210 
 union all
 select a.* from azpxx a join cte b on a.所属人1=b.序号 where b.性别='男'
 )
select * from cte order by 辈分
相反一下就OK了
sagehemu 2016-07-19
  • 打赏
  • 举报
回复
好用,多谢了!
唐诗三百首 2016-07-19
  • 打赏
  • 举报
回复

with cte as
(select * from azpxx where 序号=210
 union all
 select a.*
  from azpxx a
  inner join cte b on a.所属人=b.序号
  where a.性别='男'
  and not exists(select 1 
                 from azpxx c 
                 where c.所属人=b.序号 and c.性别='男' and c.排行<a.排行)
)
select * from cte order by 辈分
唐诗三百首 2016-07-19
  • 打赏
  • 举报
回复
请提供一下实际数据, 才好分析.
sagehemu 2016-07-19
  • 打赏
  • 举报
回复
这是查询结果
sagehemu 2016-07-19
  • 打赏
  • 举报
回复
不行呀,显示的结果不对呀,查的不是长子!
唐诗三百首 2016-07-19
  • 打赏
  • 举报
回复

with cte as
(select * from azpxx where 序号=210
 union all
 select a.*
  from azpxx a
  inner join cte b on a.所属人=b.序号
  where a.性别='男'
  and not exists(select 1 
                 from azpxx c 
                 where c.所属人=b.序号 and c.性别='男' and c.排行>a.排行)
)
select * from cte order by 辈分
sagehemu 2016-07-19
  • 打赏
  • 举报
回复
儿子的所属人为父亲的序号,另外 所属关系为儿子或性别为男都表示为儿子,最综是第几个儿子要看排行,不过排行有可能女儿是1,儿子是2,但也要取儿子
唐诗三百首 2016-07-19
  • 打赏
  • 举报
回复
请问第一个儿子的筛选原则是什么?
sagehemu 2016-07-19
  • 打赏
  • 举报
回复
第二个儿子不用取,只取第一个儿子,可能是我描述的有问题,不过需求就是这样的。就是取被查找人的第一个儿子,第一个儿子的第一个儿子,一直到没有子嗣
唐诗三百首 2016-07-19
  • 打赏
  • 举报
回复
"如何获取所有子代呀?" ""要求只显示第一个儿子及下级,也就是该人的第一个儿子,第一个儿子的第一个儿子,以此类推" ==> LZ的需求描述前后有矛盾喔. 请问第2个儿子不算是子代吗?

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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