这是我的桌子:
mysql> select * from professor;
+-------+--------+--------+--------+------+
| empid | name | status | salary | age |
+-------+--------+--------+--------+------+
| 1 | Arun | 1 | 2000 | 23 |
| 2 | Benoy | 0 | 3000 | 25 |
| 3 | Chacko | 1 | 1000 | 36 |
| 4 | Divin | 0 | 5000 | 32 |
| 5 | Edwin | 1 | 2500 | 55 |
| 7 | George | 0 | 1500 | 46 |
+-------+--------+--------+--------+------+
6 rows in set (0.00 sec)
mysql> select * from works;
+----------+-------+---------+
| courseid | empid | classid |
+----------+-------+---------+
| 1 | 1 | 10 |
| 2 | 2 | 9 |
| 3 | 3 | 8 |
| 4 | 4 | 10 |
| 5 | 5 | 9 |
| 6 | 1 | 9 |
| 2 | 3 | 10 |
| 2 | 1 | 7 |
| 4 | 2 | 6 |
| 2 | 4 | 6 |
| 2 | 5 | 2 |
| 7 | 5 | 6 |
| 3 | 5 | 2 |
| 6 | 4 | 10 |
| 2 | 7 | 1 |
+----------+-------+---------+
15 rows in set (0.00 sec)
mysql> select * from course;
+----------+------------+--------+
| courseid | coursename | points |
+----------+------------+--------+
| 1 | Maths | 5 |
| 2 | Science | 1 |
| 3 | English | 6 |
| 4 | Social | 4 |
| 5 | Malayalam | 20 |
| 6 | Arts | 25 |
| 7 | Biology | 20 |
+----------+------------+--------+
7 rows in set (0.00 sec)问题是:
退还所有教授教授的课程。
我尝试的查询是:
select course.coursename from
course inner join works
on course.courseid=works.empid
group by works.courseid
having works.empid in (select empid from professor);我遇到了这样的错误:
' in /ALL/ANY子查询‘中未知列'works.empid’
请帮我解决这个问题。
http://sqlfiddle.com/#!2/4b197/5
发布于 2014-02-01 19:09:30
首先,查询与您想要的内容相去甚远。我只想解决这个错误。
这个错误很有趣。简而言之,MySQL允许一些被称为隐藏列的东西(如下所述)。但是,这些只在having子句包含在select子句中时才起作用。我还不知道呢。
以下两个查询解析正确(为了简洁起见,我跳过中间部分):
select course.coursename, works.empid
. . .
having works.empid = 1;
select course.coursename, works.empid
. . .
having works.empid = 1;然而,以下两个错误都失败了:
select course.coursename
. . .
having works.empid = 1;
select course.coursename
. . .
having works.empid = 1;唯一的区别是在select子句中没有提到该列。
正在发生的情况是,您正在对group by子句使用一个group by扩展,有时称为“隐藏列”。select或having子句中的列既不是聚合键(course.courseid),也不是聚合函数(例如min(works.empid)或group_concat(works.empid) )。显然,MySQL只在‘`select子句中已经识别了having子句中的这些列。在您学习SQL的阶段,您不应该这样做。按照文档关闭这个扩展并转到ANSI标准行为:
若要通过扩展禁用MySQL组,请启用ONLY_FULL_GROUP_BY SQL模式。这就启用了标准的SQL行为:在GROUP子句中未命名的列不能在select list或This子句中使用,除非包含在聚合函数中。
解决语法问题的方法是使用聚合函数,如下所示:
select course.coursename
. . .
having min(works.empid) = 1;
select course.coursename
. . .
having min(works.empid) = 1;这将使您无法进行工作查询,因为您的查询远远不能解决问题。但它将修复语法错误。
发布于 2014-02-01 19:02:20
course和professor之间进行交叉连接,以获得各种课程和教授的组合;works之间建立一个外部连接,以识别那些(course, professor)组合中的哪一个实际存在;因此:
SELECT course.*
FROM (course, professor) LEFT JOIN works USING (courseid, empid)
GROUP BY courseid
HAVING SUM(works.empid IS NULL) = 0发布于 2014-02-01 19:00:17
试试这个:
select c.coursename, w.empid from
course as c inner join works as w
on (c.courseid=w.empid)
group by w.courseid
having w.empid in (select p.empid from professor as p);https://stackoverflow.com/questions/21502135
复制相似问题