SQL Server查询 – 奇怪的行为
考虑下面的SQL.
SELECT DISTINCT bvc_Order.ID,bvc_OrderItem.ProductID,bvc_OrderItem_BundleItem.ProductID FROM dbo.bvc_OrderItem WITH (nolock) RIGHT OUTER JOIN dbo.bvc_Order WITH (nolock) LEFT OUTER JOIN dbo.bvc_User WITH (nolock) ON dbo.bvc_Order.UserID = dbo.bvc_User.ID LEFT OUTER JOIN dbo.Amazon_Merchants WITH (nolock) ON dbo.bvc_Order.CompanyID = dbo.Amazon_Merchants.ID ON dbo.bvc_OrderItem.OrderID = dbo.bvc_Order.ID LEFT OUTER JOIN dbo.bvc_OrderItem_BundleItem WITH (nolock) ON dbo.bvc_OrderItem.ID = dbo.bvc_OrderItem_BundleItem.OrderItemID LEFT OUTER JOIN dbo.bvc_Product WITH (nolock) ON dbo.bvc_OrderItem.ProductID = dbo.bvc_Product.ID WHERE 1=1 AND (bvc_Order.StatusCode <> 1 AND bvc_Order.StatusCode <> 999) AND ( bvc_OrderItem.ProductID IN ('28046_00') OR bvc_OrderItem_BundleItem.ProductID IN ('28046_00')) AND bvc_Order.OrderSource = 56; 我对数据库执行时的查询,返回85行.嗯,这不正确. OR bvc_OrderItem_BundleItem.ProductID IN ('28046_00') 即使使用bvc_Order.OrderSource过滤器,它也会按预期返回5行. 表bvc_OrderItem_BundleItem不包含结果顺序ID或OrderItemIDs的任何行 [编辑] 谢谢大家,我试图删除左/右连接混合,但查询管理器不允许只有LEFT,它确实添加至少一个右连接.我更新了SQL以删除额外的表,现在我们只有三个.但结果相同 SELECT DISTINCT dbo.bvc_Order.ID,dbo.bvc_OrderItem.ProductID,dbo.bvc_OrderItem_BundleItem.ProductID AS Expr1 FROM dbo.bvc_OrderItem LEFT OUTER JOIN dbo.bvc_OrderItem_BundleItem ON dbo.bvc_OrderItem.ID = dbo.bvc_OrderItem_BundleItem.OrderItemId RIGHT OUTER JOIN dbo.bvc_Order ON dbo.bvc_OrderItem.OrderID = dbo.bvc_Order.ID WHERE 1=1 AND (bvc_Order.StatusCode <> 1 AND bvc_Order.StatusCode <> 999) AND ( bvc_OrderItem.ProductID IN ('28046_00') OR bvc_OrderItem_BundleItem.ProductID IN ('28046_00') ) AND bvc_Order.OrderSource = 56; [编辑]到目前为止,没有解决方案.我之前在评论中粘贴了一个链接,其中包含有关查询的有效/无效结果的示例数据输出.这是再次. 这里要记住的一件事是,所有左连接都是不可能的.让我进一步解释 现在并非每个产品都有子产品,因此bvc_OrderItem_BundleItem可能没有任何记录(在当前情况下,bvC_OrderItem_BundleItem中的订单实际上没有有效行). 谢谢 解决方法当你说WHERE bvc_Order.OrderSource = 56 当bvc_Order.OrderSource为NULL时,计算结果为false.如果LEFT / RIGHT连接失败,那么它将为NULL.这有效地将LEFT / RIGHT连接转换为内连接. 您可能应该将谓词写入ON子句.另一种可能无法产生相同结果的方法是: WHERE (bvc_Order.OrderSource IS NULL OR bvc_Order.OrderSource = 56) 其他谓词也有同样的问题:
当连接失败时,bvc_OrderItem_BundleItem.ProductID为NULL. 我还建议手动编写查询.如果我理解你,这个查询来自设计师.它的结构很混乱.我正在提出最重要的评论:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |