不存在和相关子查询如何在内部工作



我想了解NOT EXISTS在相关子查询中的工作原理。

在这个查询中,它返回了服用所有药物的患者,但我不明白为什么。

有人可以解释一下此查询执行的每个步骤中发生了什么,以及每个步骤中正在考虑和删除哪些记录。

create table medication
(
idmedic INT PRIMARY KEY,
name VARCHAR(20),
dosage NUMERIC(8,2)
);
create table patient 
(
idpac INT PRIMARY KEY,
name VARCHAR(20)
);
create table prescription  
(
idpac INT,
idmedic INT,
date DATE,
time TIME,
FOREIGN KEY (idpac) REFERENCES patient(idpac),
FOREIGN KEY (idmedic) REFERENCES medication(idmedic)
);
insert into patient (idpac, name) 
values (1, 'joe'), (2, 'tod'), (3, 'ric');
insert into medication (idmedic, name, dosage) 
values (1, 'tilenol', 0.01), (2, 'omega3', 0.02);
insert into prescription (idpac, idmedic, date, time) 
values (1, 1, '2018-01-01', '20:00'), (1, 2, '2018-01-01', '20:00'),
(2, 2, '2018-01-01', '20:00');
select 
pa.name 
from 
patient pa
where 
not exists (select 1 from medication me
where not exists (select 1
from prescription pr
where pr.idpac = pa.idpac 
and pr.idmedic = me.idmedic))

您的查询试图查找:
所有服用所有药物的患者

我已经重写了你的剧本,找到
所有没有服用任何药物的患者

-- This returns 1 Row, patient ric  
-- all the patients who take all medications
select 
pa.name 
from 
patient pa
where 
not exists (select 1 from medication me
where /**** not ****/ exists (select 1
from prescription pr
where pr.idpac = pa.idpac 
and pr.idmedic = me.idmedic))

演示:

这是它的SQL小提琴。

我认为此查询将向您阐明 EXISTS 运算符的用法。
如果不是,请尝试将子查询视为 JOIN,将 EXIST/NOT EXISTS 视为 WHERE 条件。

EXISTS 运算符解释为"指定要测试行是否存在的子查询"。
您也可以在此处查看 learn.microsoft.com 上的示例。

如果您在查询中看到双重嵌套的"不存在",这通常表明正在执行关系划分(谷歌一下,你会发现很多东西(。

将查询逐个子句翻译成非正式语言会产生如下内容:

让不存在药物的患者,而该患者没有处方,以服用该药物



翻译为

没有药物的患者不服用。

翻译为

服用所有药物的患者。

关系除法是关系代数运算符,对应于谓词逻辑中的通用量化。

相关内容

  • 没有找到相关文章

最新更新