Как я могу проверить, все ли строки в таблице дублированы (кроме одного столбца) - PullRequest
0 голосов
/ 29 июня 2019

Я работаю с таблицей хранилища данных, которая может быть разбита на заявленные строки и вычисленные строки.Я подозреваю, что вычисленные строки являются идеальными дубликатами заявленной строки (за исключением заявленной / вычисленной колонки).

Я попытался проверить это с помощью предложения кроме:

Но все записи были возвращены.Я не верю, что это возможно, и я подозреваю, что это из-за нулевых значений.

Есть ли способ сравнить записи, которые будут сравнивать нули с нулями?

SELECT a, b, c FROM table WHERE clm_cmp_cd = 'clm'
    EXCEPT
SELECT a, b, c FROM table WHERE clm_cmp_cd = 'cmp'

Но все записи были возвращены.Я не верю, что это возможно, и я подозреваю, что это из-за нулевых значений.

Есть ли способ сравнить записи, которые будут сравнивать нули с нулями?

edit: решение должно работать с произвольным числом полей с различными типами.В этом случае у меня есть ~ 100 полей, 2/3 из которых могут иметь нулевые значения.Это хранилище данных, и следует ожидать некоторой степени денормализации.

edit: я протестировал запрос, ограничив себя ненулевыми столбцами, и получил ожидаемый результат (ничего).Но я все же хотел бы сравнить поля, которые могут содержать нулевые значения.

Ответы [ 2 ]

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

Давайте посмотрим, как Db2 работает со значениями NULL в GROUP BY и INTERSECT:

with t(a, b, clm_cmp_cd) as (values
  (   1, 1, 'clm')
, (   1, 1, 'cmp')
, (null, 1, 'clm')
, (null, 1, 'cmp')
, (   2, 1, 'cmp')
)
select a, b
from t
where clm_cmp_cd='clm'
  intersect
select a, b
from t
where clm_cmp_cd='cmp';

with t(a, b, clm_cmp_cd) as (values
  (   1, 1, 'clm')
, (   1, 1, 'cmp')
, (null, 1, 'clm')
, (null, 1, 'cmp')
, (   2, 1, 'cmp')
)
select a, b
from t
where clm_cmp_cd in ('clm', 'cmp')
group by a, b
having count(1)>1;

Оба запроса возвращают одинаковый результат:

     A  B
    -- --
     1  1
<null>  1

NULLэти операторы обрабатывают значения одинаково.
Если в вашей таблице слишком много столбцов, чтобы указывать их вручную в запросе, вы можете создать список столбцов со следующим запросом:

select listagg(colname, ', ')
from syscat.columns
where tabschema='MYSCHEMA' and tabname='TABLE' and colname<>'CLM_CMP_CD';
0 голосов
/ 29 июня 2019

Ваше предположение может показаться ложным.Вы можете попробовать это:

select a, b, c,
       sum(case when clm_cmp_cd = 'clm' then 1 else 0 end) as num_clm,
       sum(case when clm_cmp_cd = 'cmp' then 1 else 0 end) as num_cmp
from t
group by a, b, c;

Это покажет вам значения трех столбцов и количество совпадений каждого типа.

Возможно, ваша проблема в том, что значения, которые похожи друг на друга, не совпадаютточно так же.Это может произойти из-за небольших различий в числе с плавающей запятой или из-за несоответствующих символов в строке, таких как начальные пробелы.

...