【发布时间】: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 的记录。
我之前的计划是将id 和parent_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