繁体   English   中英

Microsoft SQL Server Management Studio错误地重写我的查询

[英]Microsoft SQL Server Management Studio Rewrites my query incorrectly

我试图在Microsoft SQL Server Management Studio 2008 R2中创建一个简单的视图。 我尝试使用Views> New View设计器以及直接在查询构建器中输入CREATE VIEW命令,但无论我如何创建它,工作室都会使我的查询出错。

这是源查询。 特别注意WHERE子句:

 SELECT RTRIM(Orders.ITEMNUMBER) AS ItemNumber, 
        Orders.Type, 
        Orders.Quantity, 
        Orders.OrderNumber, 
        OrderDetails.SaleDate, 
        OrderLineItems.ReturnType,
        OrderLineItems.Action,
        OrderLineItems.Restock,
        OrderLineItems.Return
 FROM Orders 
 INNER JOIN OrderDetails ON Orders.Type = OrderDetails.Type 
 AND Orders.OrderNumber = OrderDetails.OrderNumber 
 INNER JOIN OrderLineItems ON Orders.OrderNumber = OrderLineItems.OrderNumber
 WHERE (OrderLineItems.Type = 'INVOICE' AND Orders.Type='3') OR 
       (OrderLineItems.Type = 'RETURN' AND Orders.Type='4')

但是,无论如何,SQL Server Management Studio都会将查询错误化为:

 SELECT RTRIM(Orders.ITEMNUMBER) AS ItemNumber, 
        Orders.Type, 
        Orders.Quantity, 
        Orders.OrderNumber, 
        OrderDetails.SaleDate, 
        OrderLineItems.ReturnType,
        OrderLineItems.Action,
        OrderLineItems.Restock,
        OrderLineItems.Return
 FROM Orders 
 INNER JOIN OrderDetails ON Orders.Type = OrderDetails.Type 
 AND Orders.OrderNumber = OrderDetails.OrderNumber 
 INNER JOIN OrderLineItems ON Orders.OrderNumber = OrderLineItems.OrderNumber
 WHERE (OrderLineItems.Type = 'INVOICE') AND (Orders.Type='3') OR 
       (OrderLineItems.Type = 'RETURN') AND (Orders.Type='4')

看,不同之处在于我想拉行OrderLineItems.Type为INVOICE且Orders.Type为3的行,或者OrderLineItems.Type为RETURN,Orders.Type为4.它为我重写的查询弄乱了括号 - 它赢了我允许在OR条款的任一侧放两个AND子句。

有没有办法绕过微软的查询重写器? 或者即使括号没有正确地分离两个AND子句,上述重写的查询仍然可以正确解释?

正如我所提到的,我已经尝试在New Query视图中使用直接的CREATE查询创建它,但它仍然最终格式不正确。

谢谢你的帮助。

编辑/结论

事实证明,上述两个查询在逻辑上是等价的。 MS SQL的操作顺序使它首先评估每个AND语句,然后最后检查OR语句。 括号虽然很清楚,但是没有必要。

可能听起来很傻,但你有没有尝试过它,并且纠正之后将整个事情放在整个事物周围? 因为它坚持隔离每个条件......

WHERE((OrderLineItems.Type ='INVOICE')AND(Orders.Type ='3'))OR((OrderLineItems.Type ='RETURN')AND(Orders.Type ='4'))

通过SQL Server下的指责,你失去了可读性。

您可以尝试使用CTE来推动它:

with where_condition as 
(select 'INVOICE' OrderLineType, '3' OrderType union all 
 select 'RETURN', '4')

select * from <list of your tables>, where_condition
where OrderLineItems.Type = where_condition.OrderLineType and 
Orders.Type= where_condition.OrderType

不幸的是,SQL Server还没有支持(tuple) in (select ..)语法中的(tuple) in (select ..)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM