SQL查询要么无休止地运行,要么不返回任何值

时间:2013-07-22 13:48:11

标签: sql sql-server

今天遇到多表查询问题。我自己尝试编写它似乎不起作用,所以我选择了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时,我遇到了“无法绑定多部分标识符”的错误。

3 个答案:

答案 0 :(得分:3)

A cross join会返回数以万计的记录。每个表中记录数的乘积。 。 。这可能是10,000 * 100,000 * 100 - 这是一个很大的数字。

一个警告是桌子是空的。然后该表中的行为0。 。 。并且0次都是0.因此不返回任何行。并且,不会很快返回任何行。

我认为您需要了解join在SQL中的实际作用。然后,您需要使用正确的连接条件重新实现此功能。查询不仅运行得更快,而且还会返回准确的结果。

答案 1 :(得分:1)

请勿在大型表格上使用交叉连接。以下链接将有所帮助。

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

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

条件&lt;&gt; 0将省略来自PODetail的所有非对应值。 使用(Ordernumber&lt;&gt; 0或Ordernumber为空)

答案 2 :(得分:0)

像瘟疫一样避免交叉加入。明确定义您的订单,采购订单和VendorFreight JOINS。