在postgres中将表与未嵌套的数组连接

时间:2019-11-19 20:48:42

标签: postgresql

我有一个联系表和与之相关的研究。现在,我被传递了一个整数数组,表示contact_id。我需要使用未嵌套的ID数组将当前的联系人表联接起来,如果未嵌套的整数匹配contact_id,则删除记录。

我到目前为止有这个

SELECT cvs.contact_id, cvs.study_id 
FROM study.contacts_vs_studies AS cvs
    LEFT JOIN (SELECT UNNEST('{1,2,3,4,68}'::INT[])) AS old_ids
        ON cvs.contact_id = old_ids.old_ids 
WHERE study_id = 6

这仅返回用于研究的所有可用联系人,而未嵌套数组中的任何内容都不返回。

如何获得与现有表中的select匹配的未嵌套数组的结果? TY

2 个答案:

答案 0 :(得分:0)

我认为您的查询可以满足您的要求。但是您看不到它,因为您正在执行left join并且没有从未嵌套的数组中选择任何内容。

请考虑以下示例数据:

contact_id | study_id
---------: | -------:
         1 |        1
         2 |        2
         5 |        5

现在,如果我们运行以下查询:

select cvs.contact_id, cvs.study_id, old_ids.old_ids
from contacts_vs_studies as cvs
left join unnest('{1,2,3,4,68}'::int[]) as old_ids 
    on cvs.contact_id = old_ids.old_ids 

我们得到:

contact_id | study_id | old_ids
---------: | -------: | ------:
         1 |        1 |       1
         2 |        2 |       2
         5 |        5 |    null

现在您可以看到第三条记录不匹配。要仅根据匹配的记录进行过滤,可以使用inner join代替left join

select cvs.contact_id, cvs.study_id
from contacts_vs_studies as cvs
inner join unnest('{1,2,3,4,68}'::int[]) as old_ids 
    on cvs.contact_id = old_ids.old_ids 
contact_id | study_id
---------: | -------:
         1 |        1
         2 |        2

或者,如果您只想要不匹配的记录:

select cvs.contact_id, cvs.study_id
from contacts_vs_studies as cvs
left join unnest('{1,2,3,4,68}'::int[]) as old_ids 
    on cvs.contact_id = old_ids.old_ids 
where old_ids.old_ids is null
contact_id | study_id
---------: | -------:
         5 |        5

答案 1 :(得分:0)

  

我需要使用未嵌套的ID数组将当前的联系人表联接起来,如果未嵌套的整数匹配contact_id,则删除记录。

听起来像根本不需要JOIN。只需直接编写DELETE命令:

DELETE FROM study.contacts_vs_studies AS cvs
WHERE cvs.contact_id = ANY('{1,2,3,4,68}'::INT[])
  AND cvs.study_id = 6