子查询上的聚合函数需要奇怪的“AS”子句

问题描述 投票:0回答:1

我需要在关系表中找到第五大的id。我有以下 SQL,它可以满足我的要求:

SELECT MIN(id)
FROM (
    SELECT TOP 5 id
    FROM MyTable
    ORDER BY id DESC
)
AS why_do_we_need_this

这是一个虚构的例子;我的现实生活问题更复杂。我的问题是这样的:

为什么需要最后的

AS blah-blah
?不做不行工作:

SELECT MIN(id)
FROM (
    SELECT TOP 5 id
    FROM MyTable
    ORDER BY id DESC
)

我不是 SQL 专家。如果有人能告诉我为什么第一个片段有效,而第二个片段无效,我将不胜感激。

这是 SQLite 的版本,它也可以工作。当然,这是不同的,但里面没有什么能让我“嗯?”

SELECT MIN(id)
FROM MyTable
WHERE id IN (
    SELECT id
    FROM MyTable
    ORDER BY id DESC
    LIMIT 5
)
sql sql-server sqlite
1个回答
1
投票

当您构造任何查询时,例如

select ... from ( query )

(query)
执行并返回其结果以供外部查询使用。这称为派生表

每个表都必须有一个名称,通过该名称可以引用它以消除任何歧义,并且包括派生表,它通过

as <alias name>
语法指定名称。

这在 SQL Server / t-sql 中始终是必需的。如果您从多个表中进行选择,特别是如果引用的列对于表来说不是唯一的,则您必须通过其

aliasName.columnName
引用它,只有当所有表都有名称或别名时才可以这样做.

这在其他数据库产品中很常见(尽管不通用),例如 MySql

© www.soinside.com 2019 - 2024. All rights reserved.