如果我需要选择数据“EXCEPT”其他一些数据,我应该采用什么方法?

时间:2011-11-14 19:53:58

标签: sql tsql filtering where-clause

如果我需要选择一个数据来覆盖其他一些数据,我应该采用什么方法来构建我的SQL查询?

例如,我的

我想要从数据库中选择所有数据 EXCEPT 这个结果集:

SELECT *
FROM table1
WHERE table1.MarketTYpe = 'EmergingMarkets'
AND IsBigOne = 1
AND MarketVolume = 'MIDDLE'
AND SomeClass = 'ThirdClass'

我应该使用

  • NOT IN(aboe结果集)
  • 或者shoudl我得到的条件如:= = etat of = etc。
  • 或?

你能建议吗?

5 个答案:

答案 0 :(得分:6)

使用EXCEPT构造?

SELECT *
FROM table1
EXCEPT
SELECT *
FROM table1
WHERE table1.MarketTYpe = 'EmergingMarkets'
AND IsBigOne = 1
AND MarketVolume = 'MIDDLE'
AND SomeClass = 'ThirdClass'

请注意,EXCEPTNOT EXISTS使用“左反半连接”提供相同的查询计划。

如果子查询中有NULL值,

NOT IN (subquery with above)可能给出正确的结果,因此我不会使用

我会避免WHERE子句中的否定,因为它不能立即读取
正如评论显示迈克尔的答案......

有关“除某些行以外的所有行”的更多信息,请参阅以下内容:

答案 1 :(得分:2)

这里最简单也可能最快的就是简单地反转条件:

SELECT *
FROM table1
WHERE table1.MarketTYpe <> 'EmergingMarkets'
  OR IsBigOne <> 1
  OR MarketVolume <> 'MIDDLE'
  OR SomeClass <> 'ThirdClass'

这可能比使用NOT IN()的资源少得多。您可能希望对它们进行基准测试以确定,但上述情况可能会更快。

答案 2 :(得分:2)

什么是数据库引擎?

ORACLE中的减号运算符 SQL Server

中的运算符除外

答案 3 :(得分:1)

使用NOT IN,因为这清楚地表明您希望主select语句中的集合排除NOT IN select语句中的子集。

答案 4 :(得分:1)

我喜欢gbn的答案,但另一种方法可以是:

SELECT *
FROM table1
WHERE NOT (table1.MarketTYpe = 'EmergingMarkets'
AND IsBigOne = 1
AND MarketVolume = 'MIDDLE'
AND SomeClass = 'ThirdClass')