如何测试表中的所有行是否重复(除了一列除外)



我正在使用可以将已索取的行和计算行的DataWarehouse表工作。我怀疑计算的行是声称的行的完美重复(除了声明/计算的列外(。

我尝试使用除非条款:

进行测试

,但所有记录都返回。我不认为这是可能的,我怀疑这是由于无效的价值。

是否有一种方法比较将nulls与nulls进行比较的记录?

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

,但所有记录都返回。我不认为这是可能的,我怀疑这是由于无效的价值。

是否有一种方法比较将nulls与nulls进行比较的记录?

编辑:该解决方案应与任意数量的字段一起使用,具有不同的类型。在这种情况下,我有〜100个字段,其中2/3可能具有零值。这是一个数据仓库,必须期望某种程度的统计化。

编辑:我在将自己限制在非零列的同时测试了查询,我得到了我期望的结果(什么都没有(。但是,我仍然想比较可能包含空值的字段。

您的假设似乎是错误的。您可以尝试以下方法:

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;

这将向您显示三列的值和每种类型的匹配数。

您的问题可能是看起来相似的值并不完全相同。这可能是由于浮点数的略有差异或字符串中无与伦比的字符(例如领先空间(所致。

让我们看看db2如何与GROUP BYINTERSECT中的NULL值一起工作:

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';

相关内容

  • 没有找到相关文章

最新更新