在链接服务器上使用Top()的SQL子查询问题

时间:2009-09-10 14:16:34

标签: sql sql-server tsql sql-server-2008 linked-server

我使用的是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

当与本地SQL Server实例上的dbo.Customers和dbo.Orders一起使用时,它可以正常工作。它返回来自orders表的所有行,用于从Customers表返回的前10个customerIds - 1688行。

但是我有一个链接服务器,其中包含包含更多行的Customers和Orders表。当我修改脚本以使用链接服务器中的dbo.Orders和dbo.Customers表时,我得到一个奇怪的结果 - 看起来返回了正确的数据,但只返回它的前10行。

我不是SQL专家,所以我无法弄清楚为什么它应该有不同的行为。

任何建议表示赞赏。

2 个答案:

答案 0 :(得分:4)

你的子查询中有一个TOP(10)并且没有ORDER BY来启动,这意味着你不能保证每次都获得相同的10行(对于链接服务器尤其如此,因为不同的算法可用于整理匹配,即使整理相同)。

向子查询添加ORDER BY子句,以便您可以使该部分保持一致且稳定,其余部分可以正确遵循。

答案 1 :(得分:0)

首先,您缺少ORDER BY子句会使您的子查询不确定,正如@RBarryYoung指出的那样。

其次,我首先尝试更改连接顺序(子查询成为table_source子句的第一个FROM对象),如果没有,请尝试使用join hint { {1}}。