【问题标题】:Subquery automatically producing cross join子查询自动产生交叉连接
【发布时间】:2011-08-15 21:36:40
【问题描述】:

我不确定为什么,但是当我按照示例(来自 ms sql 服务器中的北风数据集)通过键入如下所示的代码在 Microsoft SQL Server Management Studio 2008 上执行子查询时,

Select Orders.OrderID, 
       (Select Customers.CompanyName 
          From Customers 
          Where Customers.CustomerID = Orders.CustomerID) As Company Name
  From Orders, 
       Customers

这个带有子查询的sql代码自动获得了交叉连接,变成了

    Select Orders.OrderID,
           (Select Customers.CompanyName 
              From Customers
             Where Customers.CustomerID = Orders.CustomerID) As Company Name
      From Orders 
CROSS JOIN Customers as Customers_1

我已经尝试了这个的几个变体,但没有解决这个问题。这是 microsoft sql server management studio 2008 的已知错误吗?如果是,是否已修补,如何找到已修补的?否则,我如何向 Microsoft 报告此问题并让他们真正快速修复它?

在我的实际查询中,我需要通过使 ID 相等来查询/查找这个特定表的名称大约 50 次,我认为为此执行任何类型的 JOIN 简直是愚蠢的,因为代码很笨拙,很长,性能可能很差?

【问题讨论】:

  • 查询是等价的——第一个使用 ANSI-89 语法,后者使用 ANSI-92 语法。子选择不会改变 ORDERS 和 CUSTOMERS 的笛卡尔积...

标签: sql subquery cross-join


【解决方案1】:

子查询不是导致交叉连接,而是缺少控制连接的条件。你需要这样的东西:

Select Orders.OrderID, (Select Customers.CompanyName From Customers Where Customers.CustomerID = Orders.CustomerID) As Company Name 
From Orders, Customers
Where Orders.CustomerID = Customers.CustomerID

【讨论】:

  • 谢谢先生您最友好的答复,但做子查询的目的不是我可以在子查询中进行条件控制,只需要在主 Select 的 WHERE 子句中重复一遍吗? ??
  • 但是做子查询的目的不是这样我可以只在子查询中进行条件控制,并且不需要在主选择的 WHERE 子句中再次重复它???否则,我需要“查找/查询”这个特定的表 50 次,Where 子句就像 Where (Orders.CustomerID = Customers.CustomerID) and (Orders.CustomerID1 = Customers.CustomerID) and (Orders.CustomerID2 = Customers. CustomerID)和......最后,我不知道我得到了什么结果???请帮忙!
  • @Peter -- 没有。这不是 SQL 的工作方式。试试我回答中的例子。进行子查询的唯一原因是分组或聚合。
  • @Hogan 是对的。在您的情况下,您甚至不需要子查询。我什至没有看你实际上试图对子查询做什么,但只是看到你需要修复你的 where 子句。就个人而言,我实际上更喜欢使用 inner join customers on <condition> 语法进行连接。
  • @squawknull - 内部连接会给他带来与我预期不同的结果。
【解决方案2】:

我不知道为什么你的书建议使用子查询——我会这样做:

Select Orders.OrderID, Customers.CompanyName 
  From Orders 
  left join Customers on Customers.CustomerID = Orders.CustomerID

【讨论】:

    【解决方案3】:

    看起来应该是相关子查询

    选择 Orders.OrderID,

       (Select Customers.CompanyName 
          From Customers 
          Where **Customers.CustomerID = Orders.CustomerID**) As Company Name
    

    来自订单

    --, -- 客户

    当内部相关子查询为每个处理的订单带来客户名称时,为什么您会再次需要客户?

    Management Studio 坚持添加 CROSS JOIN 是在警告您正在做一些奇怪的事情。尝试查询两个表:Customer,Orders 没有任何连接条件。

    此外,查询优化器通常会在处理过程中将这些相关的子查询转换为连接,但您可以在适当的情况下使用更清晰的语法。

    在哪里合适?特别是如果您需要在内部查询中生成某种聚合。

    【讨论】:

      猜你喜欢
      • 2020-03-12
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 2013-04-04
      • 2016-06-14
      • 2013-11-05
      • 2015-03-18
      • 1970-01-01
      相关资源
      最近更新 更多