例如 表为部门表 department 其中包含公司名称,一级部门名称,二级部门名称,三级部门名称
字段A 字段 B 字段 C
id pulldi name
abc abc 无敌集团
abc abc-01 综管部
abc abc-01-01 信息部
abd abd 上帝集团
abd abd-01 综管部
对比 字段B 内是否包含 A 如果包含 输出同行C (此张部门表已于其他表进行关联,已在输出部门中使用了department.name,
u.realName AS 姓名,
u.userName AS 登陆账号,
u.id AS 账号ID,
department.name AS 部门,
department.name AS 公司,
小白也不知道 如何处理怎么在公司列再次使用name
)
with t as (
select 'abc' as id,'abc' as pulldi,'wtf' as name
union all select 'abc','abc-01','dpt1'
union all select 'abc','abc-01-01','dpt1-1'
)
select * from t a
left join t b on CHARINDEX(a.id,b.pulldi)>0 and a.id<b.pulldi
where not exists(select top 1 1 from t where CHARINDEX(pulldi,a.pulldi)>0 and pulldi<>a.pulldi)
感觉你描述的逻辑有点问题,应该是对比pulldi列,如果存在包含关系则输出,否则本行不输出
经过远程后总结一下,其实问题很明显了,前边的数据咱们都忽略了
部门表存在递归关系,你在提问的时候,应该将部门表的结构描述清楚,我在远程的时候,先挨个看每个表的结构(笑哭)是一个道理
然后描述你的问题,希望不管部门在递归的第几层,都能得到特定的哪些数据,这样大家一看就知道用cte帮你解决了
原始部门表数据 ↑
原始表名:
BI_fine_user --用户表
BI_fine_user_role_middle --用户角色中间表 它的userid 对应 user表 id
BI_fine_dep_role --部门职位中间表 它的id 对应 user_role_middle表 roleid
它的departmentid 对应 department表 id
它的postid 对应 post表 id
BI_fine_department --部门表
BI_fine_post --岗位表
原始查询语句:
SELECT DISTINCT
u.realName AS 姓名,
u.userName AS 登陆账号,
u.id AS 账号ID,
fd.name AS 部门
-- fd.name AS 公司,
FROM BI_fine_user u
left JOIN fine_user_role_middle furm ON furm.userId = u.id
left JOIN fine_dep_role fdr ON furm.roleId = fdr.id
left JOIN fine_department fd ON fdr.departmentId = fd.id
查询结果:
公司与部门再同一张表,且内容穿插,
需求:表联查 查出 姓名 登录账号 id 部门 公司
感谢老顾的专业解答,已采纳,并附上老师写的详细解答步骤
-- 首先是部门表,数据都在一个表内,存在递归关系
select * from ODS.BI_fine_department
-- 可以确定没有父级的,为最顶级数据
select * from ODS.BI_fine_department where parentid is NULL
-- 已知parentid为id的递进数据关系字段,这使用cte结构表进行匹配
;with t as (
-- 入口为所有没有父级数据的项
select id,name,parentid,convert(nvarchar(max),name) as fullname from ODS.BI_fine_department where parentid is NULL
-- 使用union在cte中调用本身
union all
select a.id,a.name,a.parentid
-- 可以方便的对字符串或数值进行计算,用以作为新字段
-- 需要注意,union前后两个表,字段要一致
,t.fullname
from ODS.BI_fine_department a
-- 表t为with定义的cte名称,即自身
,t
where a.parentid=t.id
)
select * from t
-- 在已完成递归查询的基础上,以递归查询的结果为依据,对原有数据进行替换操作
;with t as (
select id,name,parentid,convert(nvarchar(max),name) as fullname from ODS.BI_fine_department where parentid is null
-- 如果t.fullname+a.name,这是完整名称,如果t.fullname后边不加,就是公司名称
union all select a.id,a.name,a.parentid,t.fullname from ODS.BI_fine_department a,t where a.parentid=t.id
)
select top 100 realname,username,u.id,t.*
from ODS.BI_fine_user u
left join ODS.BI_fine_user_role_middle furm on furm.userid=u.id
left join ODS.BI_fine_dep_role fdr on furm.roleId=fdr.id
-- 这里left join的是cte结果表,不是原来的部门表
left join t on fdr.departmentId=t.id
-- 过滤无效的role关联 去除重复内容
where furm.id is not NULL
and fdr.id is not null
-- Hmmmmm....你这个查询有重复的东西,应该是role关联时产生的
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632