select course_id
from section as S
where semester = ’Fall’ and year= 2009 and
exists (select *
from section as T
where semester = ’Spring’ and year= 2010 and
S.course_id= T.course id);
内部相关如何引用外部相关?
这里是部分关系的模式:
create table section
(course_id varchar (8),
sec_id varchar (8),
semester varchar (6),
year numeric (4,0),
building varchar (15),
room number varchar (7),
time slot_id varchar (4),
primary key (course_id, sec_id, semester, year),
foreign key (course_id) references course);
这是您的查询(尽管我已经更改了别名并更广泛地使用它们):
select s.course_id
from section s.
where s.semester = 'Fall' and
s.year= 2009 and
exists (select 1
from section s2
where s2.semester = 'Spring' and
s2.year = 2010 and
s2..course_id = s.course_id
--------------------^ correlation clause
);
这显然是在2009年秋季和2010年春季的各个部分中找到的课程。
突出显示的条件称为correlation子句。 s.course_id
指的是外部查询。
您可以将查询视为遍历外部查询的section
中的行。通过“秋天”和“ 2009”过滤器的任何行都将受到exists
过滤器的约束。
该过滤器再次遍历各行,在course_id
上匹配并测试“ Spring”和“ 2010”。
这是概念上会发生什么。这定义了结果集的外观。实际上,数据库引擎可以实现此目的,但是它喜欢产生相同的结果。