sql自连接问题-如何从同一个表中查找重复项

sql自连接问题-如何从同一个表中查找重复项,sql,join,self,Sql,Join,Self,我是一名学生 我有这样一张桌子 student (sid, sname, gender, age, year, gpa) 我想要……的结果 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

我是一名学生

我有这样一张桌子

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



我想要……的结果

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';
我尝试了以下查询,但它没有给我吞吐量

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';

自SQL引入适当的联接以来,已经有20多年了。使用它们

试试这个:

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子句中会使其在应用的位置更加明显,从而提高可读性

通过良好的格式设置和对表进行合理的排序,您实际上可以阅读查询并(希望)理解它。

使用以下代码

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'

亲爱的,这里没有自我连接,你可以使用内部连接或外部连接,如果你需要的例子,然后我会发送it@unseendreamzzz----是的,当然……这对我会有帮助的,我被困在这里了……好吧,亲爱的,发你的脚本吧,你只参加了一次
课程,你在上面加了两个条件,这两者加在一起永远不可能是真的:课程名称不能同时是“数学”和“计算机科学”。您可以尝试使用OR,但随后必须使用
having count(c.id)>1对查询进行分组,以强制执行这两个条件都已找到,并且查询将是丑陋的。尽管这一点效率稍低(如此之小,难以衡量),它的可读性更高。@unsendreamzzz…..你的答案也是正确的,但它多次重复结果集,我认为我们应该使用distinct来避免它…谢谢你。亲爱的你只是提到了加入,这是我向你发送2个答案的方式,但没关系亲爱的,它解决了你的问题,它让我高兴亲爱的:D
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'