如何选择1对多关系中的记录

时间:2016-02-23 13:14:31

标签: sql postgresql

我有联系表和联系电话表。

联系人中的每条记录都可以在联系人电话中有多条记录,但最多只能有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)

2 个答案:

答案 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