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 (式) 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]