【问题标题】:Combining columns into records for WHERE IN()将列组合成 WHERE IN() 的记录
【发布时间】:2020-09-30 14:46:41
【问题描述】:

首先,我很抱歉。我无法更改数据的存储方式,因此我必须按原样使用它。

我在 Pervasive 数据库中有一些表,如下所示:

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,给我Dave,他在family 1 中。我现在需要在family 中找到所有Users,然后从Records 表中获取所有这些记录,以及John 的记录。

我之前的计划是将idparent_id 两列展平,只返回特定时间范围内的列。到目前为止,这是我弄清楚的唯一方法:

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
    )
)

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

SELECT id, first_name, last_name 
FROM Records WHERE id 
IN(
   insert query here
)

哪个会返回:

Output:
id |  first_name  |  last_name  
 1 |  John        |  Smith
 3 |  Jared       |  Smith
 4 |  Dave        |  Smith

我可以在这里做什么?效率很重要,这些表有数十万条记录。由于 UNION ALL,我无法使用 Pervasive 中的内容。

【问题讨论】:

  • 你也可以添加你想要的输出吗?
  • "查找该家族中的所有用户..." -- 你能详细说明一下吗?
  • @TheImpaler 因为Records 表上没有family 关联,所以在查询Records 表之前,我需要从Users 表中获取所有相关的id。这些是医疗记录,User 将是记录患者,可能是 3 岁,而 Records 将包含账单信息,但他们可能是也可能不是患者。
  • “由于 UNION ALL,我无法使用 Pervasive 中的内容。” - 你是什么意思?您使用的是哪个版本的 Pervasive?
  • 版本 11。我不知道为什么它不起作用,但是当我尝试在 WHERE IN() 中使用该查询时它会引发错误。它在自己运行时工作

标签: sql pervasive pervasive-sql


【解决方案1】:

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

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
    )
)
)

【讨论】:

  • 太棒了,我曾尝试将SELECT * FROM () 作为测试而不是WHERE IN(),但没有奏效,但在执行WHERE IN() 时确实如此。谢谢。
  • 澄清一下,我试图做 SELECT DISTINCT ids FROM () 以确保我没有重复的 ids 以便 WHERE IN() 必须处理。
猜你喜欢
  • 2015-10-10
  • 2019-08-10
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 2018-08-06
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多