有两个表tableGeneral
和tableRef
。首先,我从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));
我认为当我数数时他们应该显示相同的结果,但是他们没有,我也不明白为什么会这样!谁能帮我吗?
答案 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规范,因此它可能会创建一些重复项