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)
一种方法使用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向子查询添加一个以获取基于某个列的“第一个”。此外,这应该比以前的版本具有更好的性能。