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

Typ*_*pel 5 sql sql-server ssms sql-server-2008

我正在尝试在Microsoft SQL Server Management Studio 2008 R2中创建一个简单的视图。我尝试使用“ 视图”>“新视图”设计器,以及直接在查询生成器中键入CREATE VIEW命令,但是无论我如何创建,Studio都会扭曲我的查询。

这是源查询。请特别注意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')
Run Code Online (Sandbox Code Playgroud)

但是,无论如何,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')
Run Code Online (Sandbox Code Playgroud)

看到的区别是,我想提取其中OrderLineItems.Type为INVOICE和Orders.Type为3,或OrderLineItems.Type为RETURN和Orders.Type为4的行。它为我重写的查询弄乱了括号-赢得了胜利不允许我在OR子句的任一侧放置两个AND子句。

有什么办法可以绕过微软的查询重写器?还是即使括号不能正确地分隔两个AND子句,上述重写的查询是否仍能正确解释?

如前所述,我已经尝试过在New Query视图中使用直接CREATE查询来创建此查询,但是它最终仍然格式错误。

谢谢你的帮助。

编辑/结论

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

dur*_*isn 0

可能听起来很愚蠢,但是您是否尝试过只是跟着它,并在纠正后将整个事情放在括号中?因为它坚持隔离每个条件......

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