Oracle 的部分问题在于它仍然基于 SQL 1992 ANSI 标准。SQL Server 是基于 SQL 1999 标准的,因此一些看起来像“扩展”的东西实际上是更新的标准。(我相信“OVER”子句就是其中之一。)
Oracle 对在 SQL 中放置子查询也有更多的限制。SQL Server 几乎在任何地方都允许子查询更加灵活和宽容。
SQL Server 有一种合理的方式来选择结果的“顶部”行:“SELECT TOP 1 FROM CUSTOMERS ORDER BY SALES_TOTAL”。在 Oracle 中,这变为“SELECT * FROM (SELECT CUSTOMERS ORDER BY SALES_TOTAL) WHERE ROW_NUMBER <= 1”。
当然,总是有 Oracle 臭名昭著的 SELECT (expression) FROM DUAL。
编辑添加:
现在我在工作并且可以访问我的一些示例,这是一个很好的示例。这是由 LINQ-to-SQL 生成的,但在排序后从表中选择第 41 到 50 行是一个干净的查询。它使用“OVER”子句:
SELECT [t1].[CustomerID], [t1].[CompanyName], [t1].[ContactName], [t1].[ContactTitle], [t1].[Address], [t1].[City], [t1].[Region], [t1].[PostalCode], [t1].[Country], [t1].[Phone], [t1].[Fax]
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ContactName]) AS [ROW_NUMBER], [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]
FROM [dbo].[Customers] AS [t0]
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN 40 + 1 AND 40 + 10
ORDER BY [t1].[ROW_NUMBER]