日期:2014-05-18  浏览次数:21028 次

sql leftjoin多表查询,出现重复的数据,怎么处理?
三个表
A 表
id type
1 1
2 1
3 2

B 表
id class
1 1
2 2
4 4
55 55
66 66

c表
id name
1 dfs1111d
2 kkk2Ok
3 dd3OK
1 111ddd


我先用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
1 1 1

我现在想,在这条结果的基础上,关联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
1 1 1 dfs1111d
1 1 1 111ddd

这不是我想要的结果。我想要的结果是
id type class name
1 1 1 dfs1111d
这样的sql语句该怎么写呢?

谁帮我解决下啊?














------解决方案--------------------
因为c表id=1的记录有两条,所以结果是两条是正确的,如果有重复的取第一条?
------解决方案--------------------
SQL code
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=1
where 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%'
------解决方案--------------------
SQL code

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表 C
WHERE A.ID=B.ID AND B.ID=C.ID AND A.ID='1'
/*
C表中的ID值重复了,故有两条记录
ID          TYPEA      CLASS      NAMEC
----------- ---------- ---------- ----------
1           1          1          dfs1111d  
*/