oracle12c,sql,count(*)和sum()之间的差异

ejk8hzay  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(399)

告诉我sql1和sql2之间的区别:
sql1:

select count(1)
from table_1 a
inner join table_2 b on a.key = b.key where a.id in (
  select id from table_1 group by id having count(1) > 1
)

sql2:

select sum(a) from (
  select count(1) as a
  from table_1 a
  inner join table_2 b on a.key = b.key group by a.id having count(1) > 1
)

为什么输出不一样?

guykilcj

guykilcj1#

这些查询甚至不相似。他们很不一样。让我们检查一下第一个:

select count(1)
from table_1 a
inner join table_2 b
on a.key = b.key 
where a.id in (
  select id from table_1 group by id having count(1) > 1
) ;

首先进行内部联接:

select count(1) 
from table_1 a 
inner join table_2 b 
on a.key = b.key

在本例中,可以使用count(1)、count(id)、count(*),这是等效的。您正在计算这两个表中的公共元素:那些具有相同键字段的元素。
在此之后,您将执行以下操作:

where a.id in (
      select id from table_1 group by id having count(1) > 1
    )

换句话说,表1的每个“id”在表1中必须至少有两次。
最后,你要做的是:

select count(1)

换句话说,计算这些元素。所以,翻译成英语你已经做到了:
获取表1的每条记录,并与表2的记录配对以获得id,并且只获取那些匹配的记录
对于上面的结果,只过滤出表1的id多次出现的元素
数一数结果
让我们看看第二个查询会发生什么:

select sum(a) from (
  select count(1) as a
  from table_1 a
  inner join table_2 b 
  on a.key = b.key 
  group by a.id 
  having count(1) > 1
);

您正在进行相同的内部联接:

select count(1) as a
  from table_1 a
  inner join table_2 b 
  on a.key = b.key

但是,您是按表的id对其进行分组:

group by a.id

然后只过滤出出现多次的元素:

having count(1) > 1

到目前为止,结果是一组记录,它们在两个表中都有共同的键字段,但按id分组:这意味着只有那些在表\u b中至少有两次的字段才会输出此联接。然后,按id分组,将这些结果折叠到table1.id字段中并计算结果。我想很少有记录能符合这个严格的标准。
最后,把所有这些集合相加。

lx0bsm1f

lx0bsm1f2#

当您使用count(*)时,您将对所有行进行计数。sum()函数是一个聚合函数,返回一组值中所有或不同值的总和。

相关问题