where子句中外部联接表的列上的可选筛选器



我有两个表:

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);

Student是用id获取的,所以它应该总是在结果中返回。课程注册中的条目是可选的,如果有匹配的行,则应返回,并且这些匹配的行应在isfinished=false时进行筛选。这意味着我想获得尚未完成的课程注册。尝试将studentcourseregistration外部联接,并在isfinished=false上筛选courseregistration。注意,我仍然想找回这个学生。

尝试此操作不会返回任何行:

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

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

这是一个调整后的例子。我可以调整我的代码来解决这个问题,但我真的很想知道;正确/聪明的方式";在postgresql中解决这个问题?


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<gt;小提琴这里

最新更新