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

时间:2014-03-21 20:11:39

标签: sql sql-server sql-server-2008 ssms

我正在尝试在Microsoft SQL Server Management Studio 2008 R2中创建一个简单的视图。我尝试使用视图 - >新的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语句。为了清晰起见,括号虽然很好,但却没有必要。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

在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 ..)语法。