2009-09-10 5 views
4

Я использую SQL Server 2008 и у меня есть следующий SQL скрипт:Проблема с SQL подзапрос с использованием Top() на Linked Server

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 клиентов, возвращенных из таблицы Customers - 1688 строк.

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

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

Любые предложения оценены.

+0

Итак, таблица клиентов имеет 1688 строк в вашей среде dev, сколько заказов есть? –

+0

Просто комментарий, потому что я действительно не ожидаю, что это проблема, но возможно ли, что идентификаторы OrderID в связанной базе данных не совпадают? –

+0

Каковы версии и выпуски SQL Server, на которых вы работаете, и на которые вы ссылаетесь? – RBarryYoung

ответ

4

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

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

+1

Я добавил заказ по CustomerID, и теперь он работает. Не уверен, почему он работает на локальном сервере, но не связанном сервере, но я думаю, что мораль всегда использует предложение Order By вместе с Top(). Большое спасибо за помощь. – TonE

+0

Причина в ответе RBarry: «Это означает, что вам не гарантируется получение одинаковых 10 строк каждый раз» – MatBailie

+0

Правильно, 10 разных строк, означает, что вы получаете совершенно разные совпадения (или не совпадения) по ордерам, таким образом, полностью отличное количество строк. – RBarryYoung

0

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

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

Смежные вопросы