什么时候应该为 SQL 中的子查询添加 TAB?

Posted

技术标签:

【中文标题】什么时候应该为 SQL 中的子查询添加 TAB?【英文标题】:When should I add TAB for subqueries in SQL? 【发布时间】:2020-12-16 20:53:09 【问题描述】:

我正在 SQLZOO 中练习 SQL,但无法理解问题 #5 的解决方案:https://sqlzoo.net/wiki/Window_functions

我从另一个用户@crowtherl 那里复制了表格和问题的描述

此问题使用表格“ge”,其中包含 2015 年和 2017 年英国的大选结果。“ge”包括字段 yr、firstName、lastName、constituency、party 和 votes。问题 #5 要求学习者展示 2017 年赢得每个爱丁堡选区的政党。本教程早些时候指出,爱丁堡选区的编号为 S14000021 到 S14000026。

解决方案:Problem #5 in SQLZOO's "Window functions" tutorial

特别是关于这段代码:

  select  constituency,party from 
(
SELECT constituency,party, votes , 
rank() OVER (PARTITION BY constituency order by votes desc) rn
  FROM ge
 WHERE constituency BETWEEN 'S14000021' AND 'S14000026'
   AND yr  = 2017
ORDER BY constituency,votes DESC
) TAB WHERE rn =1

如果我在外部查询中运行上面没有“TAB”的查询,我会得到:“错误: 每个派生表都必须有自己的别名。”

四处搜索后,我找不到一个很好的答案来解释为什么我需要添加“TAB”。这是 MariaDB 特有的吗?有人知道吗?谢谢。

【问题讨论】:

【参考方案1】:

我相信这是标准 SQL。为了清楚起见,“TAB”是第二个 SELECT 产生的表的别名,即括号内的那个。它可以是您选择的任何名称(例如“T1”、“Extract”或“Whatever”),不必是“TAB”。

【讨论】:

谢谢,但为什么我必须使用别名才能运行此查询?子查询必须有别名吗? 是的,子查询必须有一个别名。我猜这只是 SQL 语法的一部分。我记得我第一次遇到的时候也被这个迷惑了!

以上是关于什么时候应该为 SQL 中的子查询添加 TAB?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 不能使用从 group by 中的子查询返回的列

大查询:使用函数结果连接(错误:连接谓词中的子查询应该只依赖于一个连接端。)

ORACLE LEFT JOIN 子查询 在SQL SERVER中可以使用如图中的子查询,ORACLE中怎么实现

FROM中的子查询不在Oracle SQL中工作

SQL中的子查询

FROM 中的子查询在 Oracle SQL 中不起作用