2013-03-18 46 views
2

表:SQL查询来获取所有的教授

  • 教授(EMP ID,名称,状态,薪水,年龄)
  • 课程(课程编号,课程名称,点)
  • 厂(场ID,EMP ID,类ID)

这是我的DB模式,并从该模式我需要得到:

返回所有教授教授的课程。

我写下面的查询显然是错误的任何人都可以请帮助我,因为我是新来的SQL。

SELECT 
    c.coursename 
FROM 
    professor p, works w, course c 
WHERE 
    p.empid = w.empid 
    AND w.courseid = c.courseid 
    AND p.empid IN (SELECT all(empid) FROM professors) 
+0

[不良习惯踢:使用旧样式的JOIN(http://sqlblog.com/blogs/ aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) - 旧式*逗号分隔的表*样式列表被替换为* proper * ANSI在ANSI - ** 92 ** SQL标准中使用'JOIN'语法(**超过20年前**),并且不鼓励使用 – 2016-01-31 21:24:50

回答

3

此问题被称为Relational Division。从你的问题,你想:

..Return已经教导所有的教授这些课程..

你的标题正好相反你想要什么。

此查询会给你,

SELECT a.CourseID, a.Course 
FROM Course a 
     INNER JOIN Works b 
      ON a.CourseID = b.CourseID 
     INNER JOIN Professor c 
      ON b.EmpID = c.EmpID 
GROUP BY a.CourseID, a.Course 
HAVING COUNT(DISTINCT c.EmpID) = (SELECT COUNT(*) FROM Professor) 
+3

我不知道为什么这个答案是downvoted。据我所知,我已经阅读了这个问题,并且我明白了这个问题':''@downvoter,我想知道这有什么问题,这样我可以进一步改进我的答案。 – 2013-03-18 06:10:49

+0

+1这么好的问题。 @JW。只是想问(好奇心)为什么你保持**状态**忙,因为就我而言,你总是**活跃**在堆栈溢出并准备好帮助其他人。 **:P ** – Luv 2013-03-18 06:29:09

+0

@Luv多任务':)'实际上这是一个旧的状态..它已经完成了。这就是为什么一些标签有效。 – 2013-03-18 06:29:48

0

尝试此查询

SELECT 
    courseName 
FROM 
    Course c 
WHERE 
    NOT EXISTS (SELECT 
     EMP_ID 
    FROM 
     Professor p, 
     works w 
    WHERE 
     c.CourseID = w.CourseID AND 
     p.EMP_ID <> w.EMP_ID)