我有一个联系人表:
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)
;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 OUTER
为INNER
。
归档时间: |
|
查看次数: |
2305 次 |
最近记录: |