我不确定为什么,但是当我按照示例(来自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都是愚蠢的因为代码是吝啬的,很长,性能可能很差?
答案 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是一个警告,你正在做一些奇怪的事情。尝试查询两个表:客户,没有任何连接条件的订单。
此外,查询优化器通常会在处理过程中将这些相关的子查询转换为连接,但您可以在适当的地方使用更清晰的语法。
哪里合适?特别是如果你需要在内部查询上生成某种聚合。