gpt4 book ai didi

sql - 搜索其子项满足谓词的父记录

转载 作者:行者123 更新时间:2023-12-03 17:49:35 24 4
gpt4 key购买 nike

假设我有一个 parent 和 child 的数据库, child 保存了一种发生在 parent 身上的事情的运行记录:

create table patient (
fullname text not null,
admission_number integer primary key
);

create table history (
note text not null,
doctor text not null,
admission_number integer references patient (admission_number)
);

(只是一个例子,我不是在做医疗申请)。
history 将有许多相同 admission_number 的记录:
admission_number      doctor    note
------------------------------------
3456 Johnson Took blood pressure
7828 Johnson EKG 120, temp 99.2
3456 Nichols Drew blood
9001 Damien Discharged patient
7828 Damien Discharged patient with Rx

所以,我的问题是,我将如何构建一个查询,让我对 patient 记录的注释字段进行和/或/不搜索,例如,如果我想找到每个患者的历史包含“血压”和“出院”。

现在我正在 select 上做一个 history ,它按 admission_number 分组,将所有笔记与 group_concat(note) 结合起来,并在 having 中进行搜索,因此:
select * from history 
group by admission_number
having group_concat(note) like '%blood pressure%'
and group_concat(note) like '%discharged';

这是可行的,但它使某些详细说明变得非常复杂——例如,我想能够询问诸如“每个病史包含“血压”并且与 Damien 医生的病史说“出院”的患者,以及建立像这样在我的基本查询之上的资格非常困惑。

有没有更好的方式来表达我的基本查询?

最佳答案

这类似于您的 EXISTS方法,但以不同的方式计算子查询。
这可能会也可能不会更快,这取决于您的表和索引的组织方式以及查询的选择性。

SELECT *
FROM patient
WHERE admission_number IN (SELECT admission_number
FROM history
WHERE note LIKE '%blood pressure%')
AND admission_number IN (SELECT admission_number
FROM history
WHERE note LIKE '%discharged%'
AND doctor = 'Damien')

或者,您可以使用 compound subquery (计算交集一次可能比对每条记录执行两次 IN 更快):
SELECT *
FROM patient
WHERE admission_number IN (SELECT admission_number
FROM history
WHERE note LIKE '%blood pressure%'
INTERSECT
SELECT admission_number
FROM history
WHERE note LIKE '%discharged%'
AND doctor = 'Damien')

关于sql - 搜索其子项满足谓词的父记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15257429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com