【问题标题】:Join Table with Unnested Array in postgres在 postgres 中加入带有未嵌套数组的表
【发布时间】:2019-11-19 20:48:42
【问题描述】:

我有一个联系人表和一个与之相关的研究。现在我被传递一个整数数组,代表contact_id。如果未嵌套的整数与contact_id 匹配,我需要使用未嵌套的 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

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

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

【问题讨论】:

  • 您到底想删除哪条记录 - conacts_vs_studies 一条?您还提到了contacts 表,大概您也有一个studies 表。

标签: postgresql


【解决方案1】:

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

考虑这个示例数据:

联系方式 | 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 

我们得到:

联系方式 | study_id | old_ids ---------: | --------: | ------: 1 | 1 | 1 2 | 2 | 2 5 | 5 |

现在您可以看到第三条记录不匹配。要仅过滤匹配的记录,您可以使用 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 
联系方式 | 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
联系方式 | study_id ---------: | --------: 5 | 5

【讨论】:

    【解决方案2】:

    我需要使用未嵌套的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 2023-03-21
      相关资源
      最近更新 更多