Microsoft SQL Server Management Studio Rewrites my query incorrectly(Microsoft SQL Server Management Studio不正确地重写我的查询)
问题描述
我正在尝试在Microsoft SQL Server Management Studio 2008 R2中创建简单视图。我尝试使用Views>New View Designer,并直接在查询构建器中键入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')
但是,无论如何,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是发票和Orders.Type是3,OR OrderLineItems.Type是Return和Orders.Type是4的行。它为我重写的查询会弄乱括号-它不允许我在OR子句的两边都放两个AND子句。
有没有办法绕过Microsoft的查询重写器?或者,即使括号没有正确分隔两个AND子句,上述重写的查询仍然可以正确解释吗?
如前所述,我已经尝试在"新建查询"视图中使用直接的CREATE查询创建此查询,但结果仍然不正确。
感谢您的帮助。
编辑/结论
所以上面的两个查询在逻辑上是等价的。MS SQL的操作顺序导致它首先计算每个AND语句,然后最后检查OR语句。括号虽然很清楚,但没有必要。
推荐答案
在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 ..)
语法。
这篇关于Microsoft SQL Server Management Studio不正确地重写我的查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Microsoft SQL Server Management Studio不正确地重写我的查询
- 如何将uuid存储为数字? 2021-01-01
- 创建索引时,具有 mysql 数据库迁移的实体框架失败 2022-01-01
- SQL Server 将 Varchar 转换为日期时间 2021-01-01
- MySql 错误 150 - 外键 2021-01-01
- Oracle SQL 转置 2022-01-01
- 在 Oracle 中创建 CTE 2022-01-01
- SSMS 中的权限问题:“对象 'extended_properties'、数据库 'mssqlsystem_resource'、... 错误 229)上的 SELECT 权限被拒绝" 2022-01-01
- 如何在oracle中获取字符串最右边的10个位置 2021-01-01
- MySQL(Windows10)使用 MyISAM 表进行 FULLTEXT 搜索不起作用 2022-01-01
- HEROKU - 无法运行 git push heroku master 2021-01-01