2016-01-18 55 views
4

我想從下表中獲得結果。獲取除ID = 102的蘋果以外的所有ID和treetype。SQL Server中的替代項

Id   TreeType 
--------------------- 
99   Apple 
99   Mango 
102  Orange 
101  Blackberry 
102  Apple 

結果會是。

Id   TreeType 
--------------------- 
99   Apple 
99   Mango 
102  Orange 
101  Blackberry 

我們可以從下面的查詢中得到結果的一種方法。

select id, TreeType 
from x 

except 

select id, TreeType 
from x 
where id = 102 and TreeType = 'Apple' 

它有可能從一個select語句得到結果嗎?

我只是想避免因爲在實際情況下它對我而言成本非常高昂。

+0

'其中id <> 102 OR treetype <>「Apple'' –

回答

4

如何只

SELECT id,TreeType 
FROM x 
WHERE NOT(id = 102 AND TreeType = 'Apple') 

這的確絆倒了我在第一,但 - 我想了想WHERE (id <> 102 AND TreeType <> 'Apple')會工作,但事實並非如此。這是有道理的,當你重新考慮它的bool的表 - 在這種情況下它會是

id opr. TreeType 
====================== 
true AND  false -- 99 apple: false 
true AND  true  -- 99 mango: true 
true AND  false -- 102 orange: false 
true AND  true  -- 101 blackberry: true 
false AND  true  -- 102 apple: false 

使用上面的語法,我們得到的只是我們想要的目標是真實的,並使用NOT行。

id opr. TreeType 
====================== 
false AND  false  -- 99 apple: not(false) = true 
false AND  false  -- 99 mango: not(false) = true 
true AND  false  -- 102 orange: not(false) = true 
false AND  true  -- 101 blackberry: not(false) = true 
true AND  true  -- 102 apple: not(true) = false 
+0

謝謝親愛的,它的工作。 –

+0

沒問題 - 如果這解決了您的問題,請考慮通過點擊投票搖桿下的綠色複選框來接受答案。 –

+1

當然'NOT(id = 102 AND TreeType ='Apple')'與'(id <> 102 AND TreeType <>'Apple')'不同,因爲與你的表達式等價的是'id <> 102 OR treetype <>'Apple'' - 這是[boolean algebra](https://en.wikipedia.org/wiki/De_Morgan's_laws)。 –

4

另一種解決方案是使用NOT EXISTS像這 -

SELECT id,TreeType 
FROM x t 
WHERE NOT EXISTS 
(
    SELECT 1 FROM x 
    WHERE 
     id = t.id AND TreeType = t.TreeType 
     AND id = 102 
     AND TreeType = 'Apple' 
)