我有一个联系表和与之相关的研究。现在,我被传递了一个整数数组,表示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
答案 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