我有联系表和联系电话表。
联系人中的每条记录都可以在联系人电话中有多条记录,但最多只能有1条记录(主要是布尔值,但也可以是NULL)
Contacts
:
cid name address
1 Jack A
2 Bill B
3 Mor C
4 Jeff D
ContactsPhones
:
cpid cid phone primary
1 1 140 True
2 1 150
3 2 170
我需要编写一个返回所有联系人及其详细信息的查询,如果他们有超过1部手机,则只提供主要信息。
输出:
cid name address phone
1 Jack A 140
2 Bill B 170
3 Mor C
4 Jeff D
最简单的方法是什么? 请注意,主要可以有(True,False,Null)
答案 0 :(得分:2)
这有点棘手。我认为最简单的方法是distinct on
:
SELECT DISTINCT ON (cid) cid, name, address, cp.phone
FROM Contacts c LEFT JOIN
ContactsPhones cp
ON c.cid = cp.cpid
ORDER BY cid, (case when primary then 1 else 2 end);
答案 1 :(得分:1)
您可以使用LEFT JOIN
到使用ROW_NUMBER
的派生表来指定更合适的记录:
SELECT cid, name, address, phone
FROM Contacts AS c
LEFT JOIN (
SELECT phone, cpid,
ROW_NUMBER() OVER(PARTITION BY cpid
ORDER BY CASE
WHEN primary THEN 0
ELSE 1
END) AS rn
FROM ContactsPhones) AS cp
ON c.cid = cp.cpid AND cp.rn = 1