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 上过滤那些匹配的行。这意味着我想获得尚未完成的课程注册。尝试将 student
与 courseregistration
进行外部联接并在 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
我有两个表:
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 上过滤那些匹配的行。这意味着我想获得尚未完成的课程注册。尝试将 student
与 courseregistration
进行外部联接并在 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