将列组合成 WHERE IN() 的记录
Combining columns into records for WHERE IN()
首先,我很抱歉。我无法控制更改数据的存储方式,因此我必须按原样使用它。
我在 Pervasive 数据库中有一些 tables,如下所示:
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
将包含账单信息,但它们可能是也可能不是患者。
我需要 Records
table 中基于 Times
table 的数据,但我必须通过 Users
[=55] =] 获取关联。问题是我想要的不仅仅是获得完全匹配的记录,而是将它们分配给 family
组和 return Records
family
[ 的所有成员=34=]
所以在这种情况下,我会查看 Times
table,得到 user_id
4,它与 Users
table 相匹配,给我 Dave
谁在 family
1. 我现在需要找到 family
中的所有 Users
,然后从 Records
中获取所有这些记录table,以及 John
的记录。
我之前的计划是将 id
和 parent_id
两列展平,并且仅展平 return 特定时间范围内的列。到目前为止,这是我唯一想到的方法:
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
)
哪个 return:
Output:
id | first_name | last_name
1 | John | Smith
3 | Jared | Smith
4 | Dave | Smith
我可以在这里做什么?效率很重要,这些 table 有几十万条记录。由于 UNION ALL
,我无法使用 Pervasive 中的内容。
我创建了您的表并根据您的 post 添加了一些数据,并尝试了您的 posted 查询并且成功了。我没有足够的数据来测试性能,但您应该能够使用查询计划/查询计划查看器来确定语句是否已优化。我同时使用了 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
)
)
)
首先,我很抱歉。我无法控制更改数据的存储方式,因此我必须按原样使用它。
我在 Pervasive 数据库中有一些 tables,如下所示:
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
将包含账单信息,但它们可能是也可能不是患者。
我需要 Records
table 中基于 Times
table 的数据,但我必须通过 Users
[=55] =] 获取关联。问题是我想要的不仅仅是获得完全匹配的记录,而是将它们分配给 family
组和 return Records
family
[ 的所有成员=34=]
所以在这种情况下,我会查看 Times
table,得到 user_id
4,它与 Users
table 相匹配,给我 Dave
谁在 family
1. 我现在需要找到 family
中的所有 Users
,然后从 Records
中获取所有这些记录table,以及 John
的记录。
我之前的计划是将 id
和 parent_id
两列展平,并且仅展平 return 特定时间范围内的列。到目前为止,这是我唯一想到的方法:
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
)
哪个 return:
Output:
id | first_name | last_name
1 | John | Smith
3 | Jared | Smith
4 | Dave | Smith
我可以在这里做什么?效率很重要,这些 table 有几十万条记录。由于 UNION ALL
,我无法使用 Pervasive 中的内容。
我创建了您的表并根据您的 post 添加了一些数据,并尝试了您的 posted 查询并且成功了。我没有足够的数据来测试性能,但您应该能够使用查询计划/查询计划查看器来确定语句是否已优化。我同时使用了 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
)
)
)