一对多连接按优先级获取一行

1 sql t-sql sql-server-2008

我有一个联系人表:

ID  NAME
--- ----
1   KK
2   JKI
3   HU
Run Code Online (Sandbox Code Playgroud)

我有一张电话桌:

ID  ContactID  Phone  Type
--- ---------  -----  --------
1   1          569    Business
2   1          896    Mobile
3   1          258    Fax
4   2          369    Mobile
5   3          124    Fax
6   2          496    Fax
Run Code Online (Sandbox Code Playgroud)

我想获取至少有一个电话号码的所有联系人。要显示的电话号码应为“商务”,如果没有可用的商务类型,则为“移动”,如果没有可用的“移动”类型,则为“传真”,否则为 null

结果示例:

ID  NAME   PHONE
--- ------ ------
1   KK     569   -- Business present
2   JKI    369   -- Business not present but mobile present
3   HU     124   -- only fax present
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 5

;WITH [prior](i,t) AS 
(
    SELECT 1, 'Business'
    UNION ALL SELECT 2, 'Mobile'
    UNION ALL SELECT 3, 'Fax'
),
x AS 
(
  SELECT c.ID, c.Name, p.Phone,
    rn = ROW_NUMBER() OVER (PARTITION BY c.ID ORDER BY r.i)
  FROM dbo.Contacts AS c
  LEFT OUTER JOIN dbo.Phone AS p
  ON p.ContactID = c.ID
  LEFT OUTER JOIN [prior] AS r
  ON r.t = p.[Type]
)
SELECT ID, Name, Phone FROM x
WHERE rn = 1;
Run Code Online (Sandbox Code Playgroud)

如果您想消除没有电话的联系人,只需将两个实例更改LEFT OUTERINNER