我需要在关系表中找到第五大的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
)
当您构造任何查询时,例如
select ... from ( query )
(query)
执行并返回其结果以供外部查询使用。这称为派生表。
每个表都必须有一个名称,通过该名称可以引用它以消除任何歧义,并且包括派生表,它通过
as <alias name>
语法指定名称。
这在 SQL Server / t-sql 中始终是必需的。如果您从多个表中进行选择,特别是如果引用的列对于表来说不是唯一的,则您必须通过其
aliasName.columnName
引用它,只有当所有表都有名称或别名时才可以这样做.
这在其他数据库产品中很常见(尽管不通用),例如 MySql