左联接与用另一个表更新一个表的结果不同

时间:2019-06-14 14:10:52

标签: sql oracle

有两个表tableGeneraltableRef。首先,我从table1中创建了一个新的tableGeneral,并且在tableRef字段相同的情况下与spec进行了左联接。然后,我计算了加入后添加的pk_num,它是9200条记录。 其次,我从table2创建了一个tableGenral。然后,我添加了一个列,并通过选择table2来更新pk_num并使用子查询进行更新,其中的规范与table2中的相同。算上f_num,结果得到6900条记录! 我为两者都做了count(distinct(...))

p.s。此外,pk_num是唯一的,在子查询中使用min只是因为重复的行具有相同的pk_num。因此,它对结果没有影响。 ps。我的桌子不够小,无法包含在这里。

第一个查询:

create table table1 as
(
select a.ID, a.spec, b.pk_num from tableGeneral a
left join tableRef b
on upper(a.spec)=upper(b.spec)
group by a.ID, a.spec, b.pk_num);

第二次查询:

create table table2 as
(
select ID, spec
from tableGeneral
);

alter table table2
add f_num VARCHAR(100); 

update table2 a
set f_num=null;

update  table2 a
set a.f_num=(select /*+parallel(12)*/ min(b.pk_num)
from tableRef b
where upper(a.spec)=upper(b.spec));

我认为当我数数时他们应该显示相同的结果,但是他们没有,我也不明白为什么会这样!谁能帮我吗?

2 个答案:

答案 0 :(得分:0)

如果您在TableRef中重复,它们将不会显示相同的计数。您可以检查以下内容:

select upper(r.spec)
from tableref r
group by upper(r.spec)
having count(distinct r.pk_num) > 1;

为什么?在第一个查询中,您将pk包含在GROUP BY中,因此聚合不会删除重复项。

答案 1 :(得分:0)

如果您的tableGeneral有多个用于不同ID的“规范”,则table2的行自然少于table1,因为table2为每个唯一规范取MIN(PK_NUM),而table1为每个现有的取每个PK_NUM规范,因此它可能会创建一些重复项