我想从下表中获得结果。获取除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语句中获取结果吗?
我只是想避免,因为在实际情况下它对我来说变得非常昂贵。
答案 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'
)