【问题标题】:Problem with SQL subquery using Top() on Linked Server在链接服务器上使用 Top() 的 SQL 子查询问题
【发布时间】:2010-11-27 04:38:18
【问题描述】:

我使用的是 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 一起使用时,这可以正常工作。它返回从 Customers 表返回的前 10 个 customerIds 从 orders 表中的所有行 - 1688 行。

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

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

任何建议表示赞赏。

【问题讨论】:

  • 所以你的开发环境中customers表有1688行,有多少个订单?
  • 只是一个评论,因为我真的不认为这是问题所在,但是链接数据库上的 OrderID 是否可能不匹配?
  • 您正在执行并链接到的 SQL Server 的版本和版本是什么?
  • @Bryan S - 我希望查询返回 Top(10) 客户的所有订单。在开发环境中,有 1688 个订单属于 Top(10) 客户,客户表中有 50 行,订单表中有 20213 行。
  • @RBarryYoung - 两者的 Sql 版本相同:10.0.1600.22。开发机器在 Service Pack 1 上。链接服务器是 Service Pack 2...

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


【解决方案1】:

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

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

【讨论】:

  • 我添加了一个按 CustomerID 的订单,它现在可以正常工作了。不知道为什么它在本地服务器上工作而不是在链接服务器上工作,但我想道德总是将 Order By 子句与 Top() 结合使用。非常感谢您的帮助。
  • 原因在 RBarry 的回答中:“这意味着你不能保证每次都得到相同的 10 行”
  • 对,10 行不同,意味着您在订单上得到完全不同的匹配(或不匹配),因此行数完全不同。
  • 是的,我知道从没有 Group By 的 Top() 返回的结果是任意的。只是让我感到困惑,它在本地服务器上运行良好。我猜那是不确定性;-)
【解决方案2】:

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

其次,我会首先尝试更改连接顺序(子查询成为FROM 子句的第一个table_source 对象),如果不是,请尝试使用join hint REMOTE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多