Порядок SQL и левое внешнее соединение не имеют правильного порядка

StackOverflow https://stackoverflow.com/questions/462071

Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

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

Еще раз текст из BOL:

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

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

SELECT * FROM TopView
ORDER BY LastName

"

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top