ORDER BY
これが何を成し遂げていると思うかわかりませんか?正当な方法で(たとえば、句を追加することによって)ビューに配置した場合でも、たとえば句なしでビューから選択した場合、SQLServerは最も効率的な方法で行を自由に返すことができます。必ずしも期待する順序と一致します。これは、がオーバーロードされているためです。つまり、結果を並べ替える目的と、に含める行を指定する目的の2つを提供しようとします。この場合、常に勝ちます(ただし、データをスキャンするために選択したインデックスによっては、注文が期待どおりに機能していることがわかりますが、これは単なる偶然です)。ORDER BY
TOP
SELECT * FROM dbo.TopUsersTest;
ORDER BY
ORDER BY
TOP
TOP
ORDER BY
目的を達成するには、ビュー自体のコードではなく、ビューからデータをプルするクエリに句を追加する必要があります。
したがって、ビューコードは次のようになります。
CREATE VIEW [dbo].[TopUsersTest]
AS
SELECT
u.[DisplayName], SUM(a.AnswerMark) AS Marks
FROM
dbo.Users_Questions AS uq
INNER JOIN [dbo].[Users] AS u
ON u.[UserID] = us.[UserID]
INNER JOIN [dbo].[Answers] AS a
ON a.[AnswerID] = uq.[AnswerID]
GROUP BY u.[DisplayName];
これORDER BY
は無意味なので、含めるべきではありません。
説明のために、AdventureWorks2012を使用して、次の例を示します。
CREATE VIEW dbo.SillyView
AS
SELECT TOP 100 PERCENT
SalesOrderID, OrderDate, CustomerID , AccountNumber, TotalDue
FROM Sales.SalesOrderHeader
ORDER BY CustomerID;
GO
SELECT SalesOrderID, OrderDate, CustomerID, AccountNumber, TotalDue
FROM dbo.SillyView;
結果:
SalesOrderID OrderDate CustomerID AccountNumber TotalDue
------------ ---------- ---------- -------------- ----------
43659 2005-07-01 29825 10-4020-000676 23153.2339
43660 2005-07-01 29672 10-4020-000117 1457.3288
43661 2005-07-01 29734 10-4020-000442 36865.8012
43662 2005-07-01 29994 10-4020-000227 32474.9324
43663 2005-07-01 29565 10-4020-000510 472.3108
また、実行プランから、TOP
とORDER BY
がSQL Serverによって完全に無視され、最適化されていることがわかります。

TOP
演算子はまったくなく、並べ替えもありません。SQLServerはそれらを完全に最適化しました。
ここで、ビューを「」に変更すると、ビューに示されてORDER BY SalesID
いる順序が表示されますが、これは、前述のように、偶然の一致によるものです。
ただし、外部クエリを変更して目的の実行を行うORDER BY
場合は、次のようになります。
SELECT SalesOrderID, OrderDate, CustomerID, AccountNumber, TotalDue
FROM dbo.SillyView
ORDER BY CustomerID;
結果は希望どおりに並べ替えられます。
SalesOrderID OrderDate CustomerID AccountNumber TotalDue
------------ ---------- ---------- -------------- ----------
43793 2005-07-22 11000 10-4030-011000 3756.989
51522 2007-07-22 11000 10-4030-011000 2587.8769
57418 2007-11-04 11000 10-4030-011000 2770.2682
51493 2007-07-20 11001 10-4030-011001 2674.0227
43767 2005-07-18 11001 10-4030-011001 3729.364
そして、計画はまだビュー内のTOP
/を最適化してORDER BY
いますが、次の順序で結果を表示するための並べ替えが追加されています(少額の費用はかかりません)CustomerID
。

したがって、話の教訓は、ビューにORDERBYを入れないことです。それらを参照するクエリにORDERBYを入れます。また、並べ替えに費用がかかる場合は、それをサポートするためにインデックスを追加/変更することを検討してください。