选择 ANSI SQL 版本的 SELECT TOP 1。

18

SQL SERVER的SELECT TOP n是否有符合ANSI SQL标准的版本?


是否有选项可以确保[tag:sql-server]对Non-ANSI-SQL命令发出警告?设置SQL兼容级别以实现ANSI兼容性将是很好的选择。但据我所知,没有这样的选项。 - surfmuggle
是否有选项可以确保[tag:sql-server]对Non-ANSI-SQL命令发出警告?设置sql compatibility level以实现ANSI兼容性将是很好的选择。但据我了解,目前没有这样的选项。 - undefined
3个回答

22

ANSI/ISO SQL:2003 引入了 windowing functions

SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY age ASC) AS rownum,
    person_id,
    person_name,
    age
  FROM person
) AS foo
WHERE rownum <= 3

微软SQL Server 2005及更高版本支持此语法。 http://msdn.microsoft.com/en-us/library/ms189798(v=sql.90).aspx

ANSI/ISO SQL:2008引入了更简单的FETCH FIRST语法,可能更类似于Microsoft/Sybase的TOP语法:

SELECT person_id, person_name, age FROM person
FETCH FIRST 3 ROWS ONLY

Microsoft SQL Server 2012及更高版本支持该语法。 https://learn.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-2017#using-offset-and-fetch-to-limit-the-rows-returned

如果您仍在使用Microsoft SQL Server 2000,则应阅读我之前发布的有关执行“分页”风格查询的问题: Emulate MySQL LIMIT clause in Microsoft SQL Server 2000


3
我甚至不知道ROW_NUMBER() OVER是ANSI SQL。 - Andrew
1
@MartinSmith 谢谢您的更新。我已经编辑了我的回答并附上了一个链接。 - Bill Karwin

2

为了提供更多上下文,SQL Server有以下TOP语法

[   
    TOP (expression) [PERCENT]  
    [ WITH TIES ]  
]

相关的标准SQL等效语句如下:

FETCH FIRST expression ROWS ONLY
FETCH FIRST expression PERCENT ROWS ONLY
FETCH FIRST expression ROWS WITH TIES

许多SQL实现只支持ROWS ONLY,在这种情况下,标准的SQL等效方法是进行过滤:
-- PERCENT ROWS ONLY
percent_rank () OVER (ORDER BY ..) <= expression / 100

-- ROWS WITH TIES
rank () OVER (ORDER BY ..) <= expression

-2

'LIMIT' 可以与亚马逊的 Athena 一起使用:

SELECT * FROM myTable LIMIT 3;

第三方编辑

引用自athena

Amazon Athena是一个基于开源框架构建的无服务器交互式分析服务,支持开放表格和文件格式。Athena提供了一种简化、灵活的方式来分析存储在数据湖中的PB级数据。使用SQL或Python分析Amazon Simple Storage Service(S3)数据湖和25多个数据源,包括本地数据源或其他云系统。Athena基于开源Trino和Presto引擎以及Apache Spark框架构建,无需进行任何配置或设置。


Athena是否努力成为与SQL Server“查询兼容”的数据库? - surfmuggle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接