首页 新闻 会员 周边

postgre 一对多查询

0
悬赏园豆:20 [已解决问题] 解决于 2015-06-04 09:52

我现在有两张表,

t1: student_id, student_name

t2:course_id, student_id, course_name

t1和t2是一对多的关系,通过student_id进行关联。

现在想做这样的查询,根据课程筛选学生名字

如:

1)选择了‘English’的学生

2)未选择‘Chinese’的学生

3) 选择了‘English’并同时选择了‘Chinese’的学生

4) 选择了‘English’并没有选择了‘Chinese’的学生

类似这样的查询,条件可以组合。

请教一下有没有什么比较简便的方法可以实现各种组合查询

c00164959的主页 c00164959 | 初学一级 | 园豆:26
提问于:2015-06-02 14:03
< >
分享
最佳答案
0

1)select t1.student_name from t1,t2 where t1.student_id = t2.student_id and t2.course_name = 'English'

2)select t1.student_name from t1,t2 where t1.student_id = t2.student_id and t2.course_name <> 'Chinese'

3)select t1.student_name from t1,t2 where t1.student_id = t2.student_id and t2.course_name = 'English'  or t2.course_name = 'Chinese'

4)select t1.student_name from t1,t2 where t1.student_id = t2.student_id and t2.course_name = 'English'  and t2.course_name <> 'Chinese'

 

不知道这个是不是你要的结果。

收获园豆:20
北京_update | 菜鸟二级 |园豆:274 | 2015-06-02 14:22

 组合查询的时候不对,比如3)查出来是修了english或chinese的学生。我希望的是两门同时修的

c00164959 | 园豆:26 (初学一级) | 2015-06-02 14:34

那就把 or 改成  and 就是你要的结果了

北京_update | 园豆:274 (菜鸟二级) | 2015-06-02 14:35

@北京_update: 也不对的,因为t2表不可能有哪一条记录同时满足两个条件。是t2表里的两条记录分别满足一个条件。

c00164959 | 园豆:26 (初学一级) | 2015-06-02 14:48

@c00164959: 

select * from t1,t2,t2 as t22 where t1.student_id = t2.student_id and t1.student_id = t22.student_id and t2.student_id = t22.student_id
and t2.course_name = 'English' and t22.course_name = 'Chinese'

北京_update | 园豆:274 (菜鸟二级) | 2015-06-02 15:11

@c00164959: 

4)select * from t1,t2 where t1.student_id = t2.student_id and t2.course_name = 'English' AND t1.student_id not in ( select student_id from t2 where course_name = 'Chinese')

北京_update | 园豆:274 (菜鸟二级) | 2015-06-02 15:15

@北京_update: 这样的话,有几个条件就需要对t2加几次别名了,是吧

c00164959 | 园豆:26 (初学一级) | 2015-06-02 16:18

@c00164959: 对的,加别名是其中一种方法,使用 student_id in (select .....) 是另外一种方法。

  

北京_update | 园豆:274 (菜鸟二级) | 2015-06-02 16:23
其他回答(1)
0

1.select student_name from t1
where exists(select 'X' from t2 where course_name='English' and t2.student_id=t1.student_id )

2.select student_name from t1
where exists(select 'X' from t2 where course_name='Chinese' and t2.student_id=t1.student_id )

3.select student_name from t1
where exists(select 'X' from t2 where course_name='Chinese' and t2.student_id=t1.student_id )
and exists(select 'X' from t2 where course_name='English' and t2.student_id=t1.student_id )

4.select student_name from t1
where exists(select 'X' from t2 where course_name='Chinese' and t2.student_id=t1.student_id )
and not exists(select 'X' from t2 where course_name='English' and t2.student_id=t1.student_id )

浅草青晨 | 园豆:904 (小虾三级) | 2015-06-02 15:41

 postgre没有exists吧???

支持(0) 反对(0) c00164959 | 园豆:26 (初学一级) | 2015-06-02 16:16

@c00164959: 失误,看错了,不过我找了一下,发现http://f.dataguru.cn/thread-454912-1-1.html有用到exists,我没试过,你可以看看。

支持(0) 反对(0) 浅草青晨 | 园豆:904 (小虾三级) | 2015-06-02 17:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册