mysql 里面为什么有时候子查询需要 alias,有时候则不需要呢?

2022-10-01 20:33:13 +08:00
 movq

我给这个题提交了一个解答 https://leetcode.cn/problems/employees-with-missing-information/

这是我的代码:

with eid as (select employee_id
             from Employees),
     sid as (select employee_id
             from Salaries)
select employee_id
from (select e.employee_id as employee_id
       from eid e
       where e.employee_id not in
             (select * from sid)
      union
      select s.employee_id as employee_id
       from sid s
       where s.employee_id not in 
       		(select * from eid)
       ) t
order by employee_id;

可以发现,not in (select * from sid)not in (select * from eid)这两个子查询都没有加 alias ,但可以通过,如果加了反而不通过

from (select e.employee_id as employee_id
       from eid e
       where e.employee_id not in
             (select * from sid)
      union
      select s.employee_id as employee_id
       from sid s
       where s.employee_id not in 
       		(select * from eid)
       ) t

这个子查询则需要加别名(我的命名是 t )

为什么会这样呢?

1181 次点击
所在节点    程序员
4 条回复
liprais
2022-10-01 20:46:54 +08:00
有没有可能有些你觉得是子查询的,其实是 derive table 呢
movq
2022-10-01 20:55:12 +08:00
@liprais 所以是不是 from 后面是 derived table ,需要 alias ,但是 where clause 里面的是 subquery 不是 derived table ,所以不需要 alias ?
liprais
2022-10-01 20:55:49 +08:00
@movq
FYFX
2022-10-01 22:23:04 +08:00
你这个是 Subquery as Scalar Operand https://dev.mysql.com/doc/refman/8.0/en/scalar-subqueries.html,
然后你再看一下 derived table 的 https://dev.mysql.com/doc/refman/8.0/en/derived-tables.html
> The [AS] tbl_name clause is mandatory because every table in a FROM clause must have a name. Any columns in the derived table must have unique names.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/884256

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX