现在有两张表,x_student(id,name),x_course(id,student_id,course)。两张表通过course关联。之前有需求是筛选出没有选择某门课程的学生。通过大家的帮助,已经写好如下:
--不修english的学生
select distinct s.id,s.name
from demo64.x_student s
join demo64.x_course c
on s.id not in
(
select c.student_id
from demo64.x_course c
group by c.student_id
having string_agg(distinct c.course::varchar,',') like '%english%'
)
这样写虽然解决了问题,但是如果数据量大了会有效率问题,因为这两个表在join的时候没有加连接。然后改成了on s.id = c.student_id and s.id not in (......)的写法。
但是这个写法会有一个问题,就是如果某个学生一门课都没选,那这个学生就会被筛选掉,就选不出来了。
请教这个应该怎么处理呢?
不能加个union么
select distinct s.id,s.name
from demo64.x_student s
join
(
select distinct s.id,s.name ,c.course
from demo64.x_student s
left join demo64.x_course c
on s.id = c.student_id
) t
on s.id = t.id
and s.id not in (select c.student_id from demo64.x_course c where c.course = 'history')
order by s.id