postgresql多个子查询

时间:2013-12-08 11:03:45

标签: postgresql subquery pgadmin

我手头有一项任务,要求我返回一名学生的详细资料,该学生就读于由霍夫曼姓氏老师教授的课程中,我被困住了。

    SELECT * FROM Public."Class" WHERE tid=(
        SELECT tid FROM Public."Tutor" WHERE tname LIKE '%Hoffman');

这让我回到霍夫曼教授的课程,但从这里我不知道该去哪里。我相信我必须访问'注册'表,然后最终访问学生表,但试图无济于事。以下查询是在我打破查询之前得到的-_-我确定我必须使用HAVINGIN关键字,但我不知道如何处理他们!

SELECT * FROM Public."Student" WHERE programme='IT' (
    SELECT * FROM Public."Class" WHERE tid=(
        SELECT tid FROM Public."Tutor" WHERE tname LIKE '%Hoffman')
    );

非常感谢任何帮助!

数据库结构如下: -

Student(sid integer, sname varchar(20), programme varchar(4), level integer, age integer) 
Class(ccode varchar(6), cname varchar(25), week_day varchar(3), meets_at time, room 
varchar(6), tid integer) 
Enrolled(sid integer, ccode varchar(6)) 
Tutor(tid integer, tname varchar(20))

再次感谢:)

更新: -

SELECT DISTINCT *
FROM Public."Student" s
INNER JOIN Public."Enrolled" e ON e.sid = s.sid
INNER JOIN Public."Class" c ON c.ccode = e.ccode
INNER JOIN Public."Tutor" t ON t.tid = c.tid
WHERE programme='IT' AND t.tname LIKE '%Hoffman';

3 个答案:

答案 0 :(得分:5)

您不需要为每个验证执行子查询。这可以通过JOINS轻松完成:

SELECT s.*
FROM Student s
INNER JOIN Enrolled e ON e.sid = s.sid
INNER JOIN Class c ON c.ccode = e.ccode
INNER JOIN Tutor t ON t.tid = c.tid
WHERE t.tname LIKE '%Hoffman';

答案 1 :(得分:2)

您可以使用联接来解决此问题而不是子查询

SELECT * FROM Public."Student"  s
join Public.Enrolled e on (s.sid= e.id)
join Public.Class c on (c.ccode = e.ccode)
join Public.Tutor t on (c.tid = t.tid)
WHERE s.programme='IT' and  t.tname like  '%Hoffman' 

答案 2 :(得分:2)

上述两种解决方案将导致学生多次报告,如果他们从同一位教师注册多个班级。如果查询的唯一目标是仅选择一次学生,则下面的查询将完全相同。

SELECT *
FROM Student s
WHERE s.programme = 'IT'
AND EXISTS (
  SELECT * 
  FROM Enrolled e
  JOIN Class c ON c.ccode = e.ccode
  JOIN Tutor t ON t.tid = c.tid
  WHERE e.sid = s.sid
  AND t.tname LIKE '%Hoffman'
  );