首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >有人能解释一下为什么这些查询是不一样的吗?

有人能解释一下为什么这些查询是不一样的吗?
EN

Stack Overflow用户
提问于 2010-02-04 23:12:37
回答 4查看 183关注 0票数 2

我维护了一个查询,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
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‘并去掉减号业务呢?所以我把它重写如下:

代码语言:javascript
代码运行次数:0
运行
复制
select field_1, field_2
from source_table
where status_code not in (3, 600);

为了再次检查我的理智,我得到了每个查询的计数。令我惊讶的是,第一个查询返回789,089条记录,第二个查询返回1,518,450条记录!

我从几个角度看过这个问题,但我不知道这两个查询有什么不同。有没有人能解释一下发生了什么,或者为什么我今天早上是个笨蛋?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-04 23:18:30

这些查询确实是不同的。field_1field2不等同于status_code 3和600。field_1可以是'A‘,field_2可以是'B',因此您将从第一个SELECT中删除看起来像A, B的记录。原始的可能是实现正确结果的最好方法。

编辑:为了让您更好地了解发生了什么,您可以通过执行子查询,以类似于编写查询的方式获得相同的结果:

代码语言:javascript
代码运行次数:0
运行
复制
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)
);
票数 9
EN

Stack Overflow用户

发布于 2010-02-04 23:27:37

如果对减号和减号的组合没有唯一约束,则第二个查询可能包含重复项,而第一个查询不包含,因为‘field_1’将禁止它们。尝试使用'distinct‘进行第二个查询,并查看计数是否匹配。

票数 4
EN

Stack Overflow用户

发布于 2010-02-04 23:34:48

UNION、MINUS和INTERSECT运算符仅返回唯一值。如果有两行具有相同的field_1和field_2,则第一个查询将计数一次,而第二个查询将计数两次:

代码语言:javascript
代码运行次数:0
运行
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2200719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档