子查询自动生成交叉连接

时间:2011-04-30 03:02:21

标签: sql subquery cross-join

我不确定为什么,但是当我按照示例(来自ms sql server中的northwind数据)在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

我已经玩了几个变种,但没有运气消除这个问题。这是微软sql server管理工作室2008的已知错误吗?如果是这样,它是否已修补,我如何找到修补程序?否则,我如何向Microsoft报告并让他们快速修复它?

在我的实际查询中,我需要通过等同ID来查询/查找此特定表的名称大约50次,我认为这对于任何类型的JOIN都是愚蠢的因为代码是吝啬的,很长,性能可能很差?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我不知道为什么你的书会提出一个子查询 - 我会这样做:

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

答案 2 :(得分:0)

看起来它应该是一个相关子查询

选择Orders.OrderID,

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

来自订单

- , - - 客户

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

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

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

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