首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将列组合为WHERE IN()的记录

将列组合为WHERE IN()的记录
EN

Stack Overflow用户
提问于 2020-09-30 22:46:42
回答 1查看 28关注 0票数 0

首先,我很抱歉。我无法控制如何更改数据的存储方式,因此我必须按它的方式工作。

我在一个普及的数据库中有一些表,如下所示:

代码语言:javascript
运行
复制
Records:
id |  first_name  |  last_name  | address   | phone ....
 1 |  John
 2 |  Bill
 3 |  Jared
 4 |  Dave


Users:
id | parent_id| first_name
 2 |        2 | Bill
 3 |        1 | Jared
 4 |        1 | Dave

Times:
user_id | Date
 4      | 2020-09-29

这些是医疗记录,User将是记录的患者,可能是3岁,而Records将包含账单信息,但它们可能是也可能不是患者。

我需要来自基于Times表的Records表的数据,但我必须遍历Users表才能获得关联。问题是,我想要的不仅仅是获得完全匹配的记录,而是将它们分配给family组,并返回该family的所有成员的Records

因此,在本例中,我将查看Times表,获取与Users表匹配的user_id 4,它提供了family 1中的Dave。现在,我需要查找该Users中的所有family,然后从Records表中获取所有这些记录,以及John的记录。

我之前的计划是扁平化两列idparent_id,并且只返回在特定时间范围内的那些列。到目前为止,这是我唯一想出来的方法:

代码语言:javascript
运行
复制
SELECT "parent_id" as ids from  "Users" as u
where u."parent_id" IN(
    SELECT  "parent_id" FROM "Users" where "id" IN(  
        SELECT "user_id"
        FROM Times as a
        WHERE a.Date >=  CURRENT_DATE() - 2
        AND a.Date <=  CURRENT_DATE() + 5
    )
)
UNION ALL

SELECT "id" as ids from  "Users" as u
where u."parent_id" IN(
    SELECT  "parent_id" FROM "Users" where "id" IN(  
        SELECT "user_id"
        FROM Times as a
        WHERE a.Date >=  CURRENT_DATE() - 2
        AND a.Date <=  CURRENT_DATE() + 5
    )
)

问题是,我需要将它用作另一个查询的过滤器,如下所示:

代码语言:javascript
运行
复制
SELECT id, first_name, last_name 
FROM Records WHERE id 
IN(
   insert query here
)

它将返回:

代码语言:javascript
运行
复制
Output:
id |  first_name  |  last_name  
 1 |  John        |  Smith
 3 |  Jared       |  Smith
 4 |  Dave        |  Smith

我能在这里做些什么?效率很重要,这些表有数十万条记录。因为UNION ALL,我不能使用我在Pervasive中拥有的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-30 23:57:09

我创建了你的表格,并根据你的帖子添加了一些数据,并尝试了你的查询,它起作用了。我没有足够的数据来测试性能,但是您应该能够使用Query Plan / Query Plan Viewer来确定语句是否优化。我同时使用了PSQL 11和Zen 14 (当前版本的Pervasive PSQL),并得到了相同的(预期的)结果。我使用的查询是:

代码语言:javascript
运行
复制
create table "Users" 
(id int,
parent_id int, 
first_name char(100)
);
create table times 
(user_id int, 
"Date" date);

create table records
(id int,
first_name char(100), 
last_name char(100), 
address char(250), 
phone char(13));

insert into records values (1, 'john', 'smith', 'addr1', 'phone');
insert into records values (2, 'Bill', 'smith', 'addr1', 'phone');
insert into records values (3, 'Jared', 'smith', 'addr1', 'phone');
insert into records values (4, 'Dave', 'smith', 'addr1', 'phone');

insert into "Users" values (2,2,'Bill');
insert into "Users" values (3,1,'Jared');
insert into "Users" values (4,1,'Dave');

insert into Times values (4,'2020-09-29');

SELECT id, first_name, last_name 
FROM Records WHERE id 
IN(
   SELECT "parent_id" as ids from  "Users" as u
where u."parent_id" IN(
    SELECT  "parent_id" FROM "Users" where "id" IN(  
        SELECT "user_id"
        FROM Times as a
        WHERE a.Date >=  CURRENT_DATE() - 2
        AND a.Date <=  CURRENT_DATE() + 5
    )
)
UNION ALL

SELECT "id" as ids from  "Users" as u
where u."parent_id" IN(
    SELECT  "parent_id" FROM "Users" where "id" IN(  
        SELECT "user_id"
        FROM Times as a
        WHERE a.Date >=  CURRENT_DATE() - 2
        AND a.Date <=  CURRENT_DATE() + 5
    )
)
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64140113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档