2016-01-26 60 views
0

我有一個非常基本的SELECT聲明,這使我很悲傷。TSQL Where Statement OR + AND

我有一個主要的工具表,我從中選擇數據。在該表中,我只需要status不是Decommissioned的工具。

從那裏,我檢查工具名稱與我的LIKE子句以查看它是否匹配。這是爲我的AJAX預先完成的。

最後,它將加入一個名爲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'); 

回答

1

訂購

ANDOR更大優先。

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') 
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