新手求教left join 后,重复的字段只需显示一次的问题

hardy001001 2014-07-17 07:20:02
有三个表
A表:
ID1 ID2 ...
NAME1 AO1
NAME2 AO2
NAME3 AO3

B表:
ID11 ID12 ID13 ....
NAME1 BO1 BB1
NAME2 BO2 BB2
NAME3 BO3 BB3

C表:
ID22 ID23 ID24 ....
B01 C01 C12
B01 C01 C21
B01 C02 C22
B02 C03 C13

想要的结果是:
ID1 ID2 ID12 ID13 ID23 ID24
NAME1 AO1 BO1 BB1 C01 C12
C01 C21
C02 C22
NAME2 AO2 BO2 BB2 C03 C13
NAME3 AO3 BO3 BB3

A表与B是一一对应,但B表与C表就一对多关系,C表有可能没有记录与B表相对应
我用:
SELECT DISTINCT ID1, ID2,ID11, ID12,ID13,ID22, ID23,ID24
FROM A
LEFT JOIN B ON ID1=ID11
LEFT JOIN C ON ID12=ID22

出来的结果是:
ID1 ID2 ID12 ID13 ID23 ID24
NAME1 AO1 BO1 BB1 C01 C12
NAME1 AO1 BO1 BB1 C01 C21
NAME1 AO1 BO1 BB1 C02 C22
NAME2 AO2 BO2 BB2 C03 C13
NAME3 AO3 BO3 BB3

可我想将ID1, ID2, ID12 , ID13 都重复的只取第一条记录,请问高手们,这语句怎么写才能出现我想要的效果啊!!!
我这里是SQL2000
...全文
2168 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hardy001001 2014-07-18
  • 打赏
  • 举报
回复
非家感谢版主的回复,按你说法,成功了,好开心啊,,谢谢
唐诗三百首 2014-07-17
  • 打赏
  • 举报
回复
SQL2000的方法,

create table A表
(ID1 varchar(10),ID2 varchar(10))

insert into A表
 select 'NAME1','AO1' union all
 select 'NAME2','AO2' union all
 select 'NAME3','AO3'
 
create table B表
(ID11 varchar(10),ID12 varchar(10),ID13 varchar(10))

insert into B表
 select 'NAME1','BO1','BB1' union all
 select 'NAME2','BO2','BB2' union all
 select 'NAME3','BO3','BB3'

create table C表
(ID22 varchar(10),ID23 varchar(10),ID24 varchar(10))

insert into C表
 select 'BO1','C01','C12' union all
 select 'BO1','C01','C21' union all
 select 'BO1','C02','C22' union all
 select 'BO2','C03','C13'
 

select ID22,ID23,ID24,identity(int,1,1) 'rn'
 into #c 
 from C表

select case when c.rn=1 or c.rn is null then t.ID1 else '' end 'ID1',
       case when c.rn=1 or c.rn is null then t.ID2 else '' end 'ID2',
       case when c.rn=1 or c.rn is null then t.ID12 else '' end 'ID12',
       case when c.rn=1 or c.rn is null then t.ID13 else '' end 'ID13',
       isnull(c.ID23,'') 'ID23',
       isnull(c.ID24,'') 'ID24'
 from (select a.ID1,a.ID2,b.ID12,b.ID13
       from A表 a
       left join B表 b on a.ID1=b.ID11) t
 left join (select x.ID22,x.ID23,x.ID24,
                   (select count(1) from #c y where y.ID22=x.ID22 and y.rn<=x.rn) 'rn'
            from #c x) c on t.ID12=c.ID22

/*
ID1        ID2        ID12       ID13       ID23       ID24
---------- ---------- ---------- ---------- ---------- ----------
NAME1      AO1        BO1        BB1        C01        C12
                                            C01        C21
                                            C02        C22
NAME2      AO2        BO2        BB2        C03        C13
NAME3      AO3        BO3        BB3                   

(5 row(s) affected)
*/
hardy001001 2014-07-17
  • 打赏
  • 举报
回复
谢谢楼上两位仝仁的回复,本人是菜鸟,有很多不懂,谢谢了!!! 现在问题是ID1 ID2 ID12 ID13 列出现了相同的数值,当然C表有不重复的值,所以ID1 ID2 ID12 ID13 重复也算是正常的吧,但我现在是想要的效果是ID1 ID2 ID12 ID13 都重复的话,就只取一次的值,第二次再出现的话就显示为空或NULL,但ID23,24还是按现在语句显示!
o0Jian0o 2014-07-17
  • 打赏
  • 举报
回复
如果是去重用distinct如果想要把所有有的没有的推荐使用full join这样不需要考虑left和right的问题。我总是这样。因为我不分左右
knife_s 2014-07-17
  • 打赏
  • 举报
回复
是因为C表中存在多条记录,使用条件限定C表记录值

22,207

社区成员

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

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