tsql连接第二个表中具有重复记录的2个表

时间:2012-09-23 20:44:48

标签: tsql

我有2张桌子。

表1:

Id     Name

1      John
2      Mike
3      Sam

表2:

Name   Data

John   Data1
John   Data1
John   Data1
Mike   Data2
Mike   Data2
Sam    Data3

如果我写

select Table2.Name, Table2.Data 
from Table1 
inner join Table2 on Table1.Name= Table2.Name

我得到了所有重复的数据。

我希望能够检索如下内容:

John Data1
Mike Data2
Sam  Data3

4 个答案:

答案 0 :(得分:1)

有两种方法可以做到这一点。

您可以使用distinct子句:

select distinct t2.Name, t2.Data 
from Table1 t1
inner join Table2 t2 on t1.Name= t2.Name

Here是MSDN的链接。

您可以使用group by

select t2.Name, t2.Data 
from Table1 t1
inner join Table2 t2 on t1.Name= t2.Name
group by t2.Name, t2.Data 

Here是MSDN的链接。

我更喜欢第二种解决方案,因为我总是可以添加分组功能。

注意: 在两个查询中,我使用了别名(t1t2)。它更具可读性。

答案 1 :(得分:1)

SELECT DISTINCT NAME
     , DATA
  FROM Table2
 WHERE NAME IN (SELECT NAME
                  FROM Table1)

这里有几个不同的选择......

答案 2 :(得分:1)

您可以使用CTE并应用row_number()

;with cte as
(
  select t1.name, t2.data,
    row_number() over(partition by t1.id order by t1.id) rn
  from table1 t1
  inner join table2 t2
    on t1.name = t2.name
)
select *
from cte
where rn = 1

或非CTE版本:

select *
from 
(
  select t1.name, t2.data,
    row_number() over(partition by t1.id order by t1.id) rn
  from table1 t1
  inner join table2 t2
    on t1.name = t2.name
) x
where rn = 1

请参阅SQL Fiddle with Demo

答案 3 :(得分:0)

您正在寻找类似的东西:

select Table2.Name, Table2.Data, count(*) from Table1 
     inner join Table2 on Table1.Name= Table2.Name
     group by Table2.Name, Table2.Data;