龌龊的sql,说明了设计的不足

drop table #tableMain
drop table #tableChild1
drop table #tableChild2


create table #tableMain(mainId int, mainName varchar(10))
create table #tableChild1(mainId int, ChildId int, ChildName varchar(10))
create table #tableChild2(mainId int, ChildId int, ChildName varchar(10))

insert into #tableMain values(1,'第1条单据')
insert into #tableChild1 values(1,1,'第1条信息')
insert into #tableChild1 values(1,2,'第2条信息')
insert into #tableChild1 values(1,3,'第3条信息')
insert into #tableChild2 values(1,1,'第1个人')
insert into #tableChild2 values(1,2,'第2个人')
insert into #tableChild2 values(1,3,'第3个人')

--
insert into #tableMain values(2,'第2条单据')
insert into #tableChild1 values(2,1,'2-1条信息')
insert into #tableChild1 values(2,2,'2-2条信息')
insert into #tableChild1 values(2,3,'2-3条信息')
insert into #tableChild2 values(2,1,'2-1个人')
insert into #tableChild2 values(2,2,'2-2个人')
insert into #tableChild2 values(2,3,'2-3个人')


select * from #tableMain A, #tableChild1 B, #tableChild2 C
where A.mainId = B.mainId and A.mainId = C.mainId
mainId mainName mainId ChildId ChildName mainId ChildId ChildName
1 第1条单据 1 1 第1条信息 1 1 第1个人
1 第1条单据 1 2 第2条信息 1 1 第1个人
1 第1条单据 1 3 第3条信息 1 1 第1个人
1 第1条单据 1 1 第1条信息 1 2 第2个人
1 第1条单据 1 2 第2条信息 1 2 第2个人
1 第1条单据 1 3 第3条信息 1 2 第2个人
1 第1条单据 1 1 第1条信息 1 3 第3个人
1 第1条单据 1 2 第2条信息 1 3 第3个人
1 第1条单据 1 3 第3条信息 1 3 第3个人
2 第2条单据 2 1 2-1条信息 2 1 2-1个人
2 第2条单据 2 2 2-2条信息 2 1 2-1个人
2 第2条单据 2 3 2-3条信息 2 1 2-1个人
2 第2条单据 2 1 2-1条信息 2 2 2-2个人
2 第2条单据 2 2 2-2条信息 2 2 2-2个人
2 第2条单据 2 3 2-3条信息 2 2 2-2个人
2 第2条单据 2 1 2-1条信息 2 3 2-3个人
2 第2条单据 2 2 2-2条信息 2 3 2-3个人
2 第2条单据 2 3 2-3条信息 2 3 2-3个人

select * from #tableMain A,
(select * from #tableChild1 where ChildId in(select min(ChildId) from #tableChild1 group by mainId)) B,
(select * from #tableChild2 where ChildId in(select min(ChildId) from #tableChild2 group by mainId)) C
where A.mainId = B.mainId and A.mainId = C.mainId

mainId mainName mainId ChildId ChildName mainId ChildId ChildName
1 第1条单据 1 1 第1条信息 1 1 第1个人
2 第2条单据 2 1 2-1条信息 2 1 2-1个人

select *,
case when B.counts >1 then B.ChildName +',等' else B.ChildName end as Child1Name0 ,
case when C.counts >1 then C.ChildName +',等' else C.ChildName end as Child2Name0
from #tableMain A,
(select F.*,E.counts from #tableChild1 F,
(select count(1) counts,min(ChildId) ChildId,mainId from #tableChild1 D group by mainId) E
where F.ChildId = E.ChildId and F.mainId = E.mainId) B,
(select F.*,E.counts from #tableChild2 F,
(select count(1) counts,min(ChildId) ChildId,mainId from #tableChild2 D group by mainId) E
where F.ChildId = E.ChildId and F.mainId = E.mainId) C
where A.mainId = B.mainId and A.mainId = C.mainId

mainId mainName mainId ChildId ChildName counts mainId ChildId ChildName counts Child1Name0 Child2Name0
1 第1条单据 1 1 第1条信息 3 1 1 第1个人 3 第1条信息,等 第1个人,等
2 第2条单据 2 1 2-1条信息 3 2 1 2-1个人 3 2-1条信息,等 2-1个人,等

原文地址:https://www.cnblogs.com/zzlchn/p/2153664.html