SQLによる並べ替えと左外部結合の順序が正しくありません
-
19-08-2019 - |
質問
2つのテーブルを結合し、最初のテーブルで並べ替えるビューがあります。順序が正しくないことを除いて。時折のレコードを見逃し、最後にそれらのレコードのほとんどが順番に存在し、その最後に残りのレコードが順番に存在します。そのため、
などのレコードがあります1 (most of the records in order)
2
4
5
6
7
8
10
11
13
15
3 (the first set of missing records)
12
9 (the rest of the missing records)
14
私の見解は以下の通りです。参加する前に注文する必要がありますか?何が間違っていますか? (このビューを取得しましたが、別のdbインスタンスのまったく同じビューが正しく機能します。)
CREATE VIEW [dbo].[SampleView]
AS
SELECT TOP 100 PERCENT blp.*, ISNULL(YEAR(DATEADD(month, 2, tb.[End of D&D])), 0) AS DEMO_FY
FROM dbo.Table1 AS blp LEFT OUTER JOIN
dbo.Table2 AS tb ON blp.FACIL_NAME = tb.[Structure ID]
ORDER BY blp.ID
(編集)ソートフィールドのタイプは[ID] [int] NOT NULL IDENTITY(1、1)、
解決
SQL Server 2005およびSQL Server 2008でソートされたビューを作成するには修正プログラムがあり、それを機能させるには2000互換モードで実行する必要があります。ビューから選択するときだけで順序付けしないのはなぜですか?
他のヒント
ビューからORDER BY句を完全に削除します。代わりに、ビューのクエリ時に順序を指定します。
thisのコメントブログエントリにより、明確になります。
もう一度BOLからのテキスト:
<!> quot;ビュー、インライン関数、派生テーブル、またはサブクエリの定義でORDER BYが使用される場合、句はTOP句によって返される行を決定するためにのみ使用されます。 ORDER BY句は、クエリ自体にORDER BYも指定されていない限り、これらの構造がクエリされたときに順序付けられた結果を保証しません。<!> quot;
<!> quot;ビュー定義にはORDER BY句が含まれていますが、そのORDER BY句は、TOP句によって返される行を決定するためにのみ使用されます。ビュー自体をクエリする場合、次のクエリに示すように明示的に指定しない限り、SQL Serverは結果の順序付けを保証しません。
SELECT * FROM TopView
ORDER BY LastName
<!> quot;
ほとんどの場合、2つのSQL Serverはわずかに異なるバージョンです。これには既知の修正プログラムがあります:
常に<!> quot; order <!> quot;ソートが遅いため(N log N)、最後の可能な時点で。ビューで選択を実行すると、通常where節が含まれます。その結果セットのみをソートします。