sql leftjoin多表查询,出现重复的数据,怎么处理?
三个表
A 表
id type
11
21
32
B 表
id class
11
22
44
5555
6666
c表
id name
1dfs1111d
2kkk2Ok
3dd3OK
1111ddd
我先用A和B表,left join查询
select a.id ,a.[type] ,b.class from a left join b on a.id=b.id where a.id=1
得到的结果是
id type class
111
我现在想,在这条结果的基础上,关联C表,取出name字段,
我的做法是这样的:
select a.id ,a.[type] ,b.class ,c.[name] from a left join b on a.id=b.id left join c on a.id=c.id where a.id=1
但是结果却有2条结果:
id type class name
111dfs1111d
111111ddd
这不是我想要的结果。我想要的结果是
id type class name
111dfs1111d
这样的sql语句该怎么写呢?
谁帮我解决下啊?
[解决办法]
因为c表id=1的记录有两条,所以结果是两条是正确的,如果有重复的取第一条?
[解决办法]
select a.id ,a.[type] ,b.class ,c.[name] from a left join b on a.id=b.id left join (select *,rn=row_number() over(partition by id order by getdate())) c on a.id=c.id and rn=1where a.id=1
[解决办法]
更改c表的重复ID编号使之唯一 ,查找重复的编码
select id,count(id) from c group by id
或者加个like 语句过滤下
select a.id ,a.[type] ,b.class ,c.[name] from a left join b on a.id=b.id left join c on a.id=c.id where a.id=1 and c.name like '%s%'
[解决办法]
CREATE TABLE #A表 (ID INT, TYPEA CHAR(10))INSERT #A表 SELECT '1','1' UNION ALL SELECT '2','1' UNION ALL SELECT '3','2'CREATE TABLE #B表 (ID INT, CLASS CHAR(10))INSERT #B表 SELECT '1','1' UNION ALL SELECT '2','2' UNION ALL SELECT '4','4' UNION ALL SELECT '55','55' UNION ALL SELECT '66','66' CREATE TABLE #C表 (ID INT, NAMEC CHAR(10))INSERT #C表 SELECT '1','dfs1111d' UNION ALL SELECT '2','kkk2Ok' UNION ALL SELECT '3','dd3OK' UNION ALL SELECT '1','111ddd' DROP TABLE #b表SELECT TOP 1 A.ID,A.TYPEA,B.CLASS,C.NAMEC FROM #A表 A,#B表 B,#C表 CWHERE A.ID=B.ID AND B.ID=C.ID AND A.ID='1'/*C表中的ID值重复了,故有两条记录ID TYPEA CLASS NAMEC----------- ---------- ---------- ----------1 1 1 dfs1111d */