如何在SQL Server中仅选择每个外键的第一条记录?

tsd*_*ter 5 sql sql-server join sql-server-2005

我在联系人详细信息数据库中有行,如下所示:

contactID - bioID - AddressLine1 - City 
393         1       1 nowhere st   toronto
3921        1       2 somewhere st vancouver
3231        2       1 anywhere rd  barrie
1122        2       2 overthere st halifax      
Run Code Online (Sandbox Code Playgroud)

我目前正在内部加入一个带有列firstname, lastname等的生物表,结果如下所示:

bioid    firstname    lastname    addressline1    city
1        some         guy         1 nowhere st    toronto
1        some         guy         2 somewhere st  vancouver
2        that         girl        1 anywhere rd   barrie
2        that         girl        2 overthere st  halifax
Run Code Online (Sandbox Code Playgroud)

所以我基本上每个生物获得2行.无论如何我可以选择这一行作为这样的一行:

bioid    firstname    lastname   addressline1x1   cityx1    addressline1x2    cityx2
1        some         guy        1 nowhere st     toronto   2 somewhere st    vancouver
2        that         girl       1 anywhere rd    barrie    2 overthere st    halifax
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏.

谢谢,托马斯

编辑:

非常感谢Denis和Justin,我能够解决这个问题.但是,现在我有了另一个.

我想实际选择地址为1字段,如:

bioid    firstname    lastname    primary address         secondary address
1        some         guy         1 nowhere st, toronto   2 somewhere st, vanvouver
2        that         girl        1 anywhere rd, barrie   2 overthere st, halifax
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过连接以下列来实现:

cd1.addressline1 + ', ' cd1.city AS 'Primary Address' 
Run Code Online (Sandbox Code Playgroud)

但是,某些字段在记录中是空的,例如,如果没有辅助地址 - 那么我怎么能这样做才能使辅助地址不输出','?字段是空字符串,而不是NULL值.

再次感谢!

编辑:我有这个工作使用:

STUFF(COALESCE(', ' + NULLIF(C1.[AddressLine1], ''), '') + 
  COALESCE(', ' + NULLIF(C1.[AddressLine2], ''), '') + 
  COALESCE(', ' + NULLIF(C1.[City], ''), '') + 
  COALESCE(', ' + NULLIF(C1.[State], ''), '') + 
  COALESCE(', ' + NULLIF(C1.[Country], ''), '') + 
  COALESCE(', ' + NULLIF(C1.[ZipCode], ''), ''),1, 1, '') AS 'Primary Address'
Run Code Online (Sandbox Code Playgroud)

Den*_*eev 3

;with cd as(
select *, rn = dense_rank(partition by bioid order by addressline, city)
from ContactDetails cd
)
select c.bioid, c.firstname, c.lastname, cd1.AddressLine, cd1.City, cd2.AddressLine, cd2.City, cd3.AddressLine, cd3.City
from Contact c 
left join cd cd1 on c.bioid = cd1.bioid and cd1.rn = 1
left join cd cd2 on c.bioid = cd2.bioid and cd2.rn = 2
left join cd cd3 on c.bioid = cd3.bioid and cd3.rn = 3
Run Code Online (Sandbox Code Playgroud)