SQL Server:多表连接、主表与多个关系表关联查询统计、数据去重、合并

适用场景:在项目中,一个项目会有很多相同的属性,它们分别存放在不同的表,而我们在做关联统计报表的时候,如果直接用主表关联3个关系表,会使数据出现大量的重复,单元格合并问题也不好处理,经过个人研究发现一种写法可以实现我们想要的最终结果,如各位有更好更简单的写法可以评论指教,谢谢。

下面是场景表和查询语句,与最终得到的结果,大家可以根据自身的情况替换表名,表字段,增加多个关系表,逻辑套路一样:

示例:

主表: 

表名字段名字段说明标识主键类型允许空默认值
StProjecIdint
StProjecStProjectName项目名称nvarchar(2000)('')

关系表1: 

表名字段名字段说明标识主键类型允许空默认值
STPatentIDint
STPatentStProjecZtbId关联IDint((0))
STPatentPatentName专利名称nvarchar(500)('')

关系表2:  

表名字段名字段说明标识主键类型允许空默认值
STThesisIDint
STThesisStProjecZtbId关联IDint((0))
STThesisThesisName论文名称nvarchar(500)('')

关系表3:  

表名字段名字段说明标识主键类型允许空默认值
STOtherIDint
STOtherStProjecZtbId关联IDint((0))
STOtherName其他名称nvarchar(500)('')

SQL语句:复杂表连接查询 

--单独查出4个关系表,根据关联主键分组排序
with Patent as (select row_number() over(partition by StProjecZtbId order by StProjecZtbId) rowNumber,StProjecZtbId,PatentName from STPatent),
Thesis as(select row_number() over(partition by StProjecZtbId order by StProjecZtbId) rowNumber,StProjecZtbId,ThesisName from STThesis),
Other as(select row_number() over(partition by StProjecZtbId order by StProjecZtbId) rowNumber,StProjecZtbId,[Name] from STOther)
--主表关联4个关系表组成的零时表
select  st.Id,st.StProjectName,T.*  from StProjec st  
left join (select isnull(Patent.StProjecZtbId,isnull(Thesis.StProjecZtbId,Other.StProjecZtbId)) StProjecZtbId,PatentName,ThesisName,Other.[Name]
from Patent  
full join Thesis  on Patent.rowNumber = Thesis.rowNumber and Patent.StProjecZtbId = Thesis.StProjecZtbId --根据主键和同主键数据序号关联,做到数据并行
full join Other  on Patent.rowNumber = Other.rowNumber and Patent.StProjecZtbId = Other.StProjecZtbId --根据主键和同主键数据序号关联,做到数据并行
) T on st.Id=T.StProjecZtbId --最后关联主表Id
where 1=1
order by StProjecZtbId

 查询结果:

主表主键ID

Id

主表

StProjectName

关系表1

PatentName

关系表2

ThesisName

关系表3

Name

1项目名称1专利名称1论文名称1其他名称1
1项目名称1专利名称2论文名称2其他名称2
1项目名称1专利名称3论文名称3NULL
1项目名称1NULL论文名称4NULL

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值