强制左连接仅从右表中的匹配 Id 返回一行

Ari*_*x66 5 sql join left-join sql-server-2012

我有两个我想加入的表,右表有时每个 ID 有超过 1 行。但是我对所有的比赛都不感兴趣,只有第一个就足够了。

我怎样才能做到这一点?

例子:

福:

     Id             FooColumns....
     100             xxxxxxxx
     200             xxxxxxxx
     300             xxxxxxxx
     400             xxxxxxxx
Run Code Online (Sandbox Code Playgroud)

酒吧:

     Id             BarColumns....
     100             yyyyyyyy
     100             zzzzzzzz
     200             yyyyyyyy
     200             zzzzzzzz
Run Code Online (Sandbox Code Playgroud)

我想要的是:

FooBar:

     Id             FooColumns....     BarColumns
     100             xxxxxxxx            yyyyyyyy
     200             xxxxxxxx            yyyyyyyy
     300             xxxxxxxx              nulls
     400             xxxxxxxx              nulls
Run Code Online (Sandbox Code Playgroud)
Query: 
   Select F.*,B.* from Foo f left join Bar b on f.Id=B.Id   ?? 
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 8

一种方法使用row_number()

Select F.*, B.*
from Foo f left join
     (select b.*, row_number() over (partition by b.id order by id) as seqnum
      from bar b
     ) b
     on f.Id = B.Id and seqnum = 1; 
Run Code Online (Sandbox Code Playgroud)

order by你的“第一次”的意思指定。该order by id是任意顺序。

替代方法使用outer apply

Select F.*, B.*
from Foo f outer apply
     (select top 1 b.*
      from bar b
      where f.Id = B.Id
     ) b; 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以order by向子查询添加一个以获取基于某个列的“第一个”。此外,这应该比以前的版本具有更好的性能。