Порядок SQL в левом внешнем соединении не имеет правильного порядка - PullRequest
2 голосов
/ 20 января 2009

У меня есть представление, которое объединяет две таблицы и упорядочивает их по первой таблице. За исключением того, что порядок не правильный. Он пропускает случайную запись, а затем, в конце, большинство этих записей существует в порядке, а затем, в конце, остальные записи существуют в порядке. Так что у него есть записи, такие как

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

Мой взгляд ниже. Нужно ли делать заказ до того, как я сделаю соединение? Что я делаю неправильно? (Я получил это представление, и точно такое же представление в другом экземпляре БД работает правильно.)

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),

Ответы [ 5 ]

2 голосов
/ 20 января 2009

Комментарий в этой записи блога делает это довольно ясным.

Просто еще раз текст с BOL:

"Когда ORDER BY используется в определении представления, встроенной функции, производной таблицы или подзапроса, предложение используется только для определения строк, возвращаемых предложением TOP. Предложение ORDER BY не гарантирует упорядоченные результаты, когда эти конструкции запрашиваются, если в самом запросе не указано также ORDER BY. "

"Хотя определение представления содержит предложение ORDER BY, это предложение ORDER BY используется только для определения строк, возвращаемых предложением TOP. При запросе самого представления SQL Server не гарантирует упорядочение результатов, если только вы указать так явно, как показано в следующем запросе:

SELECT * FROM TopView
ORDER BY LastName

"

2 голосов
/ 20 января 2009

Чтение Создание отсортированного представления в SQL Server 2005 и SQL Server 2008 Существует исправление, и вы ДОЛЖНЫ работать в режиме совместимости 2000, чтобы он работал. Почему бы просто не сделать заказ при выборе из вида?

2 голосов
/ 20 января 2009

Я бы полностью удалил предложение ORDER BY из представления. Вместо этого укажите свой заказ во время запроса представления.

1 голос
/ 20 января 2009

Вы всегда должны "заказывать" в последней возможной точке, поскольку сортировка медленная (N log N). Когда вы выполняете выборку для представления, вы обычно включаете предложение where. Вы хотите отсортировать только этот набор результатов.

1 голос
/ 20 января 2009

Скорее всего, два SQL-сервера имеют несколько разные версии. Для этого есть известное исправление:

http://support.microsoft.com/kb/926292/

...