другой результат для левого соединения против обновления таблицы другой таблицей - PullRequest
0 голосов
/ 14 июня 2019

Есть две таблицы, tableGeneral и tableRef. Сначала я сделал новый table1 из tableGeneral и сделал левое соединение с tableRef, когда поля spec были одинаковыми. Затем я посчитал pk_num, который был добавлен после присоединения, и это было 9200 записей. Во-вторых, я создал table2 из tableGenral. Затем я добавил столбец и произвел обновление для table2 с помощью подзапроса, выбрав pk_num, где спецификация была такой же, как в table2. В результате 6900 записей после подсчета f_num! Я сделал count(distinct(...)) для обоих.

p.s. Более того, pk_num уникален, и использование min в подзапросе произошло только из-за дублированных строк с одинаковым pk_num. Таким образом, это не влияет на результат. постскриптум мои таблицы недостаточно малы, чтобы их можно было сюда включить.

первый запрос:

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 голосов
/ 15 июня 2019

Если у вашего tableGeneral есть несколько «спецификаций» для разных идентификаторов, то у table2 будет меньше строк, чем у table1, так как table2 использует MIN (PK_NUM) для каждой уникальной спецификации, а table1 принимает каждый PK_NUM для каждого существующего spec, поэтому он, вероятно, создаст несколько дубликатов

0 голосов
/ 14 июня 2019

Они не будут показывать одинаковое количество, если у вас есть дубликаты в TableRef. Вы можете проверить это:

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

Почему? В ваш первый запрос вы включаете pk в GROUP BY, поэтому дубликаты не удаляются агрегацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...