【发布时间】:2014-04-29 09:38:08
【问题描述】:
我正在尝试在 Microsoft SQL Server Management Studio 2008 R2 中创建一个简单的视图。我尝试使用 Views > New View Designer 以及直接在查询构建器中键入 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 子句,上述重写的查询是否仍能被正确解释?
正如我所提到的,我已经尝试在“新查询”视图中使用直接 CREATE 查询来创建它,但它最终仍然格式错误。
感谢您的帮助。
编辑/结论
所以上面的两个查询在逻辑上是等价的。 MS SQL 的操作顺序导致它首先评估每个 AND 语句,然后最后检查 OR 语句。括号虽然很清楚,但没有必要。
【问题讨论】:
-
也许通过添加inner和outer()可以绕过这个问题。这肯定是奇怪的行为。
(OrderLineItems.Type = 'INVOICE' AND Orders.Type='3') OR (OrderLineItems.Type = 'RETURN' AND Orders.Type='4')变为((OrderLineItems.Type = 'INVOICE') AND (Orders.Type='3')) OR ((OrderLineItems.Type = 'RETURN') AND (Orders.Type='4')) -
我确实尝试过,在每个部分周围添加额外的括号,例如 ((a=b) AND (c=d)) OR ((e=f) AND (g=h)) 但作为我一提交,查询生成器就会恢复为 (a=b) AND (c=d) OR (e=f) AND (g=h) ... 似乎无法理解。跨度>
-
我不得不玩弄引擎。引擎可能会处理这个给你想要的结果。查看顺序,引擎可能正在正确执行此操作。 (行类型和订单类型)或(行类型和订单类型)你得到不正确的结果吗?
-
奇怪的是,引擎似乎是正确的,由于执行的先行者stackoverflow.com/questions/1241142/… AND 先胜然后 OR。
-
哦,哇,好吧 - 这看起来很奇怪,但我想这是因为我习惯于更明确地使用括号而不是依赖于操作顺序,这可能因语言而异。我将仔细研究这些结果,看看它们是否真的正确。谢谢你。
标签: sql sql-server sql-server-2008 ssms