0

今天遇到多表查询问题。我尝试自己编写它,但它似乎不起作用,因此我选择了 Management Studio Design 视图中的所有列。代码应该可以工作,但可惜没有。如果我运行这个查询,它似乎会继续前进。我离开办公桌一分钟,当我回来停止查询时,它返回了大约 2,000,000 行(PODetail 表中只有大约 120,000 行!!):

SELECT     PODetail.OrderNum, PODetail.VendorNum, vw_orderHistory.Weight, vw_orderHistory.StdSqft, vw_orderHistory.ReqDate, vw_orderHistory.City, 
                  vw_orderHistory.State, FB_FreightVend.Miles, FB_FreightVend.RateperLoad
FROM         PODetail CROSS JOIN
                  vw_orderHistory CROSS JOIN
                  FB_FreightVend
ORDER BY ReqDate

不仅如此,似乎每条记录的 OrderNum 都为 0,但事实并非如此。所以我试图排除它......

SELECT     PODetail.OrderNum, PODetail.VendorNum, vw_orderHistory.Weight, vw_orderHistory.StdSqft, vw_orderHistory.ReqDate, vw_orderHistory.City, 
                  vw_orderHistory.State, FB_FreightVend.Miles, FB_FreightVend.RateperLoad
FROM         PODetail CROSS JOIN
                  vw_orderHistory CROSS JOIN
                  FB_FreightVend
WHERE PODetail.OrderNum <> 0
ORDER BY ReqDate

虽然它成功执行(没有错误),但它也不会返回任何记录。这里发生了什么?我也很好奇查询的 CROSS JOIN。当我自己尝试编写此代码时,我首先使用“WHERE PODetail.OrderNum = vw_orderHistory.OrderNum”来加入这些表,但我遇到了同样的无结果问题。当我尝试使用 JOIN 时,我收到有关“无法绑定多部分标识符”的错误。

4

3 回答 3

3

Across join返回数不胜数的记录。每个表中记录数的乘积。. . 那可能是 10,000 * 100,000 * 100 - 这是一个很大的数字。

一个警告是当一张桌子是空的。然后该表中的行是 0 。. . 0 次是 0。所以不返回任何行。而且,不会很快返回任何行。

我认为您需要了解joinSQL 的真正作用。然后,您需要使用正确的连接条件重新实现它。查询不仅会运行得更快,而且会返回准确的结果。

于 2013-07-22T13:53:05.003 回答
1

不要使用交叉连接,尤其是在大表上。下面的链接会有所帮助。

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

无法绑定多部分标识符。表示该列可能不存在定义。验证列是否存在、数据类型以及为连接分配的名称。

在条件 <> 0 时,将忽略 PODetail 中的所有非对应值。使用(订单号 <> 0 或订单号为空)

于 2013-07-22T18:48:13.823 回答
0

避免像瘟疫一样的交叉连接。明确定义您的 Order、PO 和 VendorFreight JOINS。

于 2013-09-16T14:12:59.780 回答