首页 > 解决方案 > 如何基于键值对查询表,其中键是整数,值是整数列表

问题描述

所以,我有一个包含 3 个东西的表:主键、table_id、foreignkey_id 和医生 ID。- table_id 是指具有特定编号的表。- foreignkey_id 指的是该表中的主键。- doctor_id 指的是医生表中的主键 现在,用户将选择他想要使用哪些表以及他想要该表中的哪些项目。我需要所有与组合匹配的医生 ID。

CREATE TABLE tConfidentiality(
    confidentiality_id serial primary key,
    table_id integer not null,
    doctor_id integer not null,
    foreignkey_id integer not null,
    constraint un_confidentiality unique(table_id, doctor_id, foreignkey_id)
);
INSERT INTO tConfidentiality(table_id, doctor_id, foreignkey_id) values(10, 100, 1000);
INSERT INTO tConfidentiality(table_id, doctor_id, foreignkey_id) values(10, 100, 2800);
INSERT INTO tConfidentiality(table_id, doctor_id, foreignkey_id) values(40, 100, 2000);
INSERT INTO tConfidentiality(table_id, doctor_id, foreignkey_id) values(80, 110, 2500);
INSERT INTO tConfidentiality(table_id, doctor_id, foreignkey_id) values(90, 120, 2800);

查询:必须对值进行参数化

表 10 中的所有医生 ID 为foreignkey_id1000 和 2800,表 40 中为foreignkey_id2000

预期结果:100

不要指望你写完整的东西,只要给我指出正确的方向,我就会从那里开始。

标签: sqlpostgresqlrelational-division

解决方案


您需要收集每个 table_id 的外键 id,然后检查是否至少包含您正在寻找的那些。在 Postgres 中,这可以通过将它们聚合成一个数组来完成:

select distinct doctor_id
from tConfidentiality
group by doctor_id, table_id
having table_id = 10 and array_agg(distinct foreignkey_id) @> array[1000,2800]
    or table_id = 40 and array_agg(distinct foreignkey_id) @> array[2000];

在线示例:https ://rextester.com/NHE4869


推荐阅读