1

我不确定为什么,但是当我按照示例(来自 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 简直是愚蠢的,因为代码很粗糙,很长,和性能可能很差?

4

3 回答 3

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
于 2011-04-30T03:12:38.597 回答
1

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

Select Orders.OrderID, Customers.CompanyName 
  From Orders 
  left join Customers on Customers.CustomerID = Orders.CustomerID
于 2011-04-30T04:17:33.077 回答
0

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

选择 Orders.OrderID,

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

从订单

- , - 顾客

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

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

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

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

于 2012-07-08T00:05:43.573 回答