我维护了一个查询,如下所示:
select field_1, field_2
from source_table
minus
select field_1, field_2
from source_table
where status_code in (3, 600);
当我看到这个查询时,我立即想到,“这太差劲了。为什么不使用'NOT IN‘并去掉减号业务呢?所以我把它重写如下:
select field_1, field_2
from source_table
where status_code not in (3, 600);
为了再次检查我的理智,我得到了每个查询的计数。令我惊讶的是,第一个查询返回789,089条记录,第二个查询返回1,518,450条记录!
我从几个角度看过这个问题,但我不知道这两个查询有什么不同。有没有人能解释一下发生了什么,或者为什么我今天早上是个笨蛋?
发布于 2010-02-04 15:18:30
这些查询确实是不同的。field_1
和field2
不等同于status_code
3和600。field_1
可以是'A‘,field_2
可以是'B',因此您将从第一个SELECT中删除看起来像A, B
的记录。原始的可能是实现正确结果的最好方法。
编辑:为了让您更好地了解发生了什么,您可以通过执行子查询,以类似于编写查询的方式获得相同的结果:
select distinct field_1, field_2
from source_table
where (field_1, field_2) not in (
select field_1, field_2
from source_table
where status_code in (3, 600)
);
发布于 2010-02-04 15:27:37
如果对减号和减号的组合没有唯一约束,则第二个查询可能包含重复项,而第一个查询不包含,因为‘field_1’将禁止它们。尝试使用'distinct‘进行第二个查询,并查看计数是否匹配。
发布于 2010-02-04 15:34:48
UNION、MINUS和INTERSECT运算符仅返回唯一值。如果有两行具有相同的field_1和field_2,则第一个查询将计数一次,而第二个查询将计数两次:
SQL> insert into source_table values ('a', 'b', 10);
SQL> insert into source_table values ('a', 'b', 10);
SQL> select field_1, field_2
2 from source_table
3 minus
4 select field_1, field_2
5 from source_table
6 where status_code in (3, 600);
FIELD_1 FIELD_2
---------- ----------
a b
SQL> select field_1, field_2
2 from source_table
3 where status_code not in (3, 600);
FIELD_1 FIELD_2
---------- ----------
a b
a b
https://stackoverflow.com/questions/2200719
复制相似问题