如果我需要选择一个数据来覆盖其他一些数据,我应该采用什么方法来构建我的SQL查询?
例如,我的
我想要从数据库中选择所有数据 EXCEPT 这个结果集:
SELECT *
FROM table1
WHERE table1.MarketTYpe = 'EmergingMarkets'
AND IsBigOne = 1
AND MarketVolume = 'MIDDLE'
AND SomeClass = 'ThirdClass'
我应该使用
你能建议吗?
答案 0 :(得分:6)
使用EXCEPT构造?
SELECT *
FROM table1
EXCEPT
SELECT *
FROM table1
WHERE table1.MarketTYpe = 'EmergingMarkets'
AND IsBigOne = 1
AND MarketVolume = 'MIDDLE'
AND SomeClass = 'ThirdClass'
请注意,EXCEPT
和NOT EXISTS
使用“左反半连接”提供相同的查询计划。
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')