2016-01-18 56 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' 
)