用sql写 一张表中有A,B,C三个字段,对比B字段中内容是否包含A,如包含输出同行C字段?

例如  表为部门表 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