我有一个非常基本的SELECT
声明让我感到悲伤。
我有一个主要的工具表,我从中选择数据。在该表格中,我只想要status
不是Decommissioned
的工具。
从那里开始,我正在根据我的LIKE
子句检查工具名称,看它是否匹配。这是为我的AJAX typeahead完成的。
最后,它正在加入一个名为akas
的表,其中包含的工具名称也可用于引用主工具。这些基本上是工具的其他别名。
我面临的问题是它仍然包含Decommissioned
状态的记录。我很确定它是WHERE
条款..有什么想法吗?
SELECT t.toolName,
t.tool AS toolID,
t.toolType,
t.toolStatus,
e1.PreferredName AS ownerFirst,
e1.LastName AS ownerLast,
e1.NTID AS ownerNTID
FROM dbo.ti_tools AS t
LEFT OUTER JOIN
dbo.ti_toolAKAs AS a
ON t.tool = a.tool
LEFT OUTER JOIN dbo.EmployeeTable AS e1
ON t.toolOwner = e1.QID
WHERE (t.toolName LIKE '%' + @tool + '%') OR (a.aka LIKE '%' + @tool + '%')
AND t.toolStatus <> 'Decommissioned'
ORDER BY t.toolName ASC
FOR XML PATH ('tools'), TYPE, ELEMENTS, ROOT ('root');
答案 0 :(得分:1)
添加圆括号:
SELECT t.toolName,
t.tool AS toolID,
t.toolType,
t.toolStatus,
e1.PreferredName AS ownerFirst,
e1.LastName AS ownerLast,
e1.NTID AS ownerNTID
FROM dbo.ti_tools AS t
LEFT OUTER JOIN dbo.ti_toolAKAs AS a
ON t.tool = a.tool
LEFT OUTER JOIN dbo.EmployeeTable AS e1
ON t.toolOwner = e1.QID
WHERE ((t.toolName LIKE '%' + @tool + '%') OR (a.aka LIKE '%' + @tool + '%'))
AND t.toolStatus <> 'Decommissioned'
ORDER BY t.toolName ASC
FOR XML PATH ('tools'), TYPE, ELEMENTS, ROOT ('root');
案件非常简单:
cond1 OR cond2 AND cond3
<=>
cond1 OR (cond2 AND cond3)
您获得的记录仅满足cond1
。你真正想要的是:
(cond1 OR cond2) AND cond3
答案 1 :(得分:1)
运营顺序
AND
的更高优先级高于OR
。
将WHERE
子句更改为以下内容,使用两个OR
条件左右的括号将它们与佣金检查逻辑分开:
WHERE ((t.toolName LIKE '%' + @tool + '%') OR (a.aka LIKE '%' + @tool + '%'))
AND t.toolStatus <> 'Decommissioned'
您的原始WHERE
子句的评估与此相同:
WHERE (t.toolName LIKE '%' + @tool + '%') OR
((a.aka LIKE '%' + @tool + '%') AND t.toolStatus <> 'Decommissioned')