首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用内部联接和具有

使用内部联接和具有
EN

Stack Overflow用户
提问于 2014-02-01 18:55:20
回答 4查看 56关注 0票数 1

这是我的桌子:

代码语言:javascript
运行
复制
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)

问题是:

退还所有教授教授的课程。

我尝试的查询是:

代码语言:javascript
运行
复制
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

EN

回答 4

Stack Overflow用户

发布于 2014-02-01 19:09:30

首先,查询与您想要的内容相去甚远。我只想解决这个错误。

这个错误很有趣。简而言之,MySQL允许一些被称为隐藏列的东西(如下所述)。但是,这些只在having子句包含在select子句中时才起作用。我还不知道呢。

以下两个查询解析正确(为了简洁起见,我跳过中间部分):

代码语言:javascript
运行
复制
select course.coursename, works.empid
. . .
having works.empid = 1;

select course.coursename, works.empid
. . .
having works.empid = 1;

然而,以下两个错误都失败了:

代码语言:javascript
运行
复制
select course.coursename
. . .
having works.empid = 1;

select course.coursename
. . .
having works.empid = 1;

唯一的区别是在select子句中没有提到该列。

正在发生的情况是,您正在对group by子句使用一个group by扩展,有时称为“隐藏列”。selecthaving子句中的列既不是聚合键(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子句中使用,除非包含在聚合函数中。

解决语法问题的方法是使用聚合函数,如下所示:

代码语言:javascript
运行
复制
select course.coursename
. . .
having min(works.empid) = 1;

select course.coursename
. . .
having min(works.empid) = 1;

这将使您无法进行工作查询,因为您的查询远远不能解决问题。但它将修复语法错误。

票数 2
EN

Stack Overflow用户

发布于 2014-02-01 19:02:20

  1. courseprofessor之间进行交叉连接,以获得各种课程和教授的组合;
  2. 在该和works之间建立一个外部连接,以识别那些(course, professor)组合中的哪一个实际存在;
  3. 按课程分组,并对不存在的此类组合的数量进行汇总;
  4. 只过滤那些没有这种不存在的组合的组。

因此:

代码语言:javascript
运行
复制
SELECT   course.*
FROM     (course, professor) LEFT JOIN works USING (courseid, empid)
GROUP BY courseid
HAVING   SUM(works.empid IS NULL) = 0
票数 0
EN

Stack Overflow用户

发布于 2014-02-01 19:00:17

试试这个:

代码语言:javascript
运行
复制
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);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21502135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档