SQL Server中除外的替代

时间:2016-01-18 19:29:57

标签: sql sql-server

我想从下表中获得结果。获取除Id = 102的Apple之外的所有ID和treetype。

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语句中获取结果吗?

我只是想避免,因为在实际情况下它对我来说变得非常昂贵。

2 个答案:

答案 0 :(得分: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

使用上面的语法,我们只得到我们想要定位的行为true并使用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

答案 1 :(得分: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'
)