主表连接到外表 - 从外表中只选择一个记录

时间:2014-06-20 11:02:34

标签: sql sql-server

使用SQL Server 2012.我有一个名为deals的表,其中包含一个名为deal_id的主键以及其他10个字段。我还有一个名为deals_country的表,其中包含一个名为deal_id的外键。

交易记录可能包含交易国家/地区的大量记录。我知道下面的查询将返回两个表的所有记录。

select deals .*, deals_country.* from deals  inner join deals_country
on deals .deal_id = deals_country.deal_id
order by deals .deal_id

我想要做的是从交易中选择所有记录并从deals_country表中只选择一条相应的记录,从deals_country获取哪条记录无关紧要。如下所示,

Deals 
deal_id       other fields 
MN13                   
MN14                   
MN15                 
MN28       

Deals_Country
deal_id     country
MN13     NL
MN13     FR
MN14     GB
MN14     US
MN15     US
MN28     CA
MN28     US
MN28     MX

我希望看到的结果,

deal_id       country 
MN13          NL
MN14          GB       
MN15          US       
MN28          CA

2 个答案:

答案 0 :(得分:2)

您可以使用cross apply

select d.*, dc.*
from deals d cross apply
     (select top 1 dc.*
      from deals_country dc
      where d.deal_id = dc.deal_id
     ) dc
order by d.deal_id;

答案 1 :(得分:1)

您可以枚举每笔交易的deals_country行并选择第一行(无论是什么):

select ...
from (
    select ...
         , row_number() over (partition by deals.deal_id) as rn 
    from deals  
    join deals_country
        on deals.deal_id = deals_country.deal_id
) as T
where rn = 1;

未经测试,但你应该明白这个想法