什么时候应该为 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?的主要内容,如果未能解决你的问题,请参考以下文章
大查询:使用函数结果连接(错误:连接谓词中的子查询应该只依赖于一个连接端。)