我使用的是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专家,所以我无法弄清楚为什么它应该有不同的行为。
任何建议表示赞赏。
答案 0 :(得分:4)
你的子查询中有一个TOP(10)并且没有ORDER BY来启动,这意味着你不能保证每次都获得相同的10行(对于链接服务器尤其如此,因为不同的算法可用于整理匹配,即使整理相同)。
向子查询添加ORDER BY子句,以便您可以使该部分保持一致且稳定,其余部分可以正确遵循。
答案 1 :(得分:0)
首先,您缺少ORDER BY
子句会使您的子查询不确定,正如@RBarryYoung指出的那样。
其次,我首先尝试更改连接顺序(子查询成为table_source
子句的第一个FROM
对象),如果没有,请尝试使用join hint { {1}}。