sql自联接问题如何从同一个表中找到重复项

时间:2014-02-03 11:38:28

标签: sql join self

我是学生,

我有这种表结构

student (sid, sname, gender, age, year, gpa)

dept(dname, numphds)

course(cno, cname, dname)

enroll(sid, grade, dname, cno, sectno)

我想要结果.....

Q-打印同时参加“计算机科学”课程和“数学”课程的学生的姓名................

我尝试了以下查询,但它没有给我吞吐量..............

select e.sid, s.sname  from 
    enroll e ,enroll e1 ,student s ,course c 
    where s.sid=e.sid, 
         e.cno =c.cno 
      and e.sid=e1.sid 
    and c.cname='computer science' and c.name='maths';

2 个答案:

答案 0 :(得分:1)

自从SQL引入正确的连接以来,已经有20多年了。 FFS使用它们!

试试这个:

select s.sid, s.sname
from student s
join enroll e on e.sid = s.sid
join course c on c.cno = e.cno and c.cname='computer science'
join enroll e1 on e1.sid = s.sid
join course c1 on c1.cno = e1.cno and c1.name='maths'

请注意如何将非关键条件置于连接条件中。虽然如果课程名称在where子句中,查询仍然有效,但将条件放在join子句中会使它们更适用于应用的位置,从而提高了可读性。

通过格式化并精确地排序表,您实际上可以阅读查询并(希望)理解它。

答案 1 :(得分:0)

使用以下代码

select e.said, s.sname from enroll e inner join 
enrool e1 on e1.sid = e.sid inner join
student s on s.sid = e.sid inner join
course c on c.cno = e.cno
where c.cname = 'computer science' and c.name = 'maths'

如果您需要使用左连接,请使用

    select e.said, s.sname from enroll e left join 
enrool e1 on e1.sid = e.sid left join
student s on s.sid = e.sid left join
course c on c.cno = e.cno
where c.cname = 'computer science' and c.name = 'maths'