Проблема с подзапросом SQL с использованием Top () на связанном сервере - PullRequest
4 голосов
/ 10 сентября 2009

Я использую SQL Server 2008 и у меня есть следующий сценарий SQL:

Select o.CustomerId as CustomerNoId, OrderValue, OrderDate
From dbo.Orders as o
Inner Join (
    Select Top (10) CustomerId
    From dbo.Customers
    where Age < 60
)
As c
On c.CustomerId = o.CustomerId

Это работает как нужно, когда используется с dbo.Customers и dbo.Orders на локальном экземпляре SQL Server. Он возвращает все строки из таблицы заказов для первых 10 customerIds, возвращенных из таблицы Customers - 1688 строк.

Однако у меня есть связанный сервер, содержащий таблицы клиентов и заказов, содержащие еще много строк. Когда я изменяю сценарий для использования таблиц dbo.Orders и dbo.Customers со связанного сервера, я получаю странный результат - похоже, возвращаются правильные данные, но только первые 10 строк.

Я не эксперт по SQL, поэтому не могу понять, почему он должен вести себя по-другому.

Любые предложения приветствуются.

Ответы [ 2 ]

4 голосов
/ 10 сентября 2009

Что ж, в вашем подзапросе есть TOP (10) и нет ORDER BY для загрузки, что означает, что вы не гарантированно получите одни и те же 10 строк каждый раз (это особенно верно для связанных серверов из-за различных алгоритмов может использоваться для сопоставления параметров сортировки, даже если параметры сортировки совпадают).

Добавьте условие ORDER BY в подзапрос, чтобы вы могли сделать эту часть согласованной и стабильной, а остальная часть может следовать правильно.

0 голосов
/ 10 сентября 2009

Во-первых, отсутствие предложения ORDER BY делает ваш подзапрос недетерминированным, как указывал @RBarryYoung.

Во-вторых, я сначала попытался бы изменить порядок соединения (подзапрос становится первым table_source объектом для предложения FROM), а если нет, попробуйте поиграть с подсказкой объединения REMOTE.

...