【发布时间】:2020-11-27 06:48:02
【问题描述】:
我有一张联系人表。该表包含一个 mobile_phone 列以及一个 home_phone 列。我想获取所有重复的联系人对,其中一对是共享一个电话号码的两个联系人。
请注意,如果联系人 A 的 mobile_phone 与联系人 B 的 home_phone 匹配,则这也是重复的。 这是应该匹配的三个联系人的示例。
contact_id|mobile_phone|home_phone|other columns such as email.......|...
-------------------------------------------------------------------------
111 |9748777777 |1112312312|..................................|...
112 |1112312312 |null |..................................|...
113 |9748777777 |0001112222|..................................|...
具体来说,我想带回一个表格,其中每一行都包含两个匹配联系人的contact_ids。例如,
||contact_id_a|contact_id_b||
||-------------------------||
|| 145155 | 145999 ||
|| 145158 | 145141 ||
在@Erwin 这里enter link description here 的帮助下,我能够编写一个接近我想要实现的查询,带回列表中与其他联系人共享电话号码的所有联系人的contact_ids 列表列表。
SELECT c.contact_id
FROM contacts c
WHERE EXISTS (
SELECT FROM contacts x
WHERE (x.data->>'mobile_phone' is not null and x.data->>'mobile_phone' IN (c.data->>'mobile_phone', c.data->>'home_phone'))
OR (x.data->>'home_phone' is not null and x.data->>'home_phone' IN (c.data->>'mobile_phone', c.data->>'home_phone'))
AND x.contact_id <> c.contact_id -- except self
);
输出只包含这样的contact_ids...
||contact_id||
--------------
|| 2341514 ||
|| 345141 ||
我想将匹配联系人的contact_ids 带回一行中,如上所示。
【问题讨论】:
-
如果 10 个联系人以某种方式共享同一个电话号码,如果我们不包括交换的重复项,那么这将是 45 (10*9/2) 行成对。这就是你想要的吗?
标签: sql postgresql duplicates