我有两个表:
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时进行筛选。这意味着我想获得尚未完成的课程注册。尝试将student
与courseregistration
外部联接,并在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;小提琴这里