where 子句中外连接 table 列的可选过滤器

Optional filter on a column of an outer joined table in the where clause

我有两个表:

create table student
(
    studentid       bigint primary key not null,
    name            varchar(200)        not null
);

create table courseregistration
(
    studentid       bigint not null,
    coursenamename  varchar(200) not null,
    isfinished        boolean default false
); 

--insert some data
insert into student values(1,'Dave');
insert into courseregistration values(1,'SQL',true);

学生是使用 id 获取的,因此它应该始终在结果中返回。 courseregistration 中的条目是可选的,如果有匹配的行则应该返回,并且应该在 isfinished=false 上过滤那些匹配的行。这意味着我想获得尚未完成的课程注册。尝试将 studentcourseregistration 进行外部联接并在 isfinished=false 上过滤 courseregistration。注意,我还是要找回学生。

尝试这个 returns 没有行:

select * from student
left outer join courseregistration using(studentid)
where studentid = 1
and courseregistration.isfinished = false

我在上面的例子中想要的是一个包含 1 行学生的结果集,但课程行为空(因为唯一的例子有 isfinished=true)。不过还有一个限制。如果 courseregistration 中没有相应的行,学生条目应该仍然有一个结果。

这是一个调整后的例子。我可以调整我的代码来解决问题,但我真的很想知道,在 postgresql 中解决这个问题的“correct/smart 方法”是什么?


PS 以前用Oracle中的(+)解决过类似的问题

这不是你要找的吗:

select * from student s
left outer join courseregistration  cr
   on s.studentid = cr.studentid
   and cr.isfinished = false
where s.studentid = 1

db<>fiddle here