验证sql中的数据集

时间:2017-10-20 20:22:11

标签: sql

我有两个数据集有六列:

  1. 上个月的数据
  2. 当前月份数据(包括更新更改的上个月数据)
  3. 如何获得下面提到的子数据集?

    一个。记录完全匹配基于所有六列(上个月记录当前月份数据没有变化)

    select * from a where (c1,c2,c3,c4,c5,c6) in (select c1,c2,c3,c4,c5,c6 from b );
    

    湾基于所有六列(当前月份数据中的新记录)完全不匹配的记录。

    ℃。记录在任何一列中都有更改的列标识符。

    d。记录在任何两列中都有更改的列标识符。

    即记录在任何三列中都有更改的列标识符。

    F。记录在任何四列中都有更改的列标识符。

    克。记录在任何五列中都有更改的列标识符。

1 个答案:

答案 0 :(得分:0)

psuedo编码,因为您了解详情。

Select case when a.c1 <> b.c1 then 1 else 0 end as c1
       case when a.c2 <> b.c2 then 1 else 0 end as c2
       ...
       case when a.c6 <> b.c6 then 1 else 0 end as c6
from a inner join b on a.recordid? = b.recordid?

我使用recordID?因为你的表中需要有一些与当月记录和过去一个月有关的东西

这会给你一个c1到c6列,如果它改变则为1,如果没有,则为0。把它变成子查询

select recordid? from 
(Select recordid?,
       case when a.c1 <> b.c1 then 1 else 0 end as c1
       case when a.c2 <> b.c2 then 1 else 0 end as c2
       ...
       case when a.c6 <> b.c6 then 1 else 0 end as c6
from a inner join b on a.recordid? = b.recordid?) a
where c1+c2+c3+c4+c5+c6 = x

X对齐您要问的问题以及更改了多少列。 x = 0没有变化。

从评论中加入。
我真的希望你没有太多行

select * from 
(Select a.*, case when a.c1 <> b.c1 then 1 else 0 end as c1,
       case when a.c2 <> b.c2 then 1 else 0 end as c2,
       ...
       case when a.c6 <> b.c6 then 1 else 0 end as c6
from a inner join b on 1=1) a
where c1+c2+c3+c4+c5+c6 = 0

我们基本上删除了加入条件。这称为交叉连接,将在结果中生成此月份记录*上个月记录,然后将其过滤掉。 c1 + c2 + c3 + c4 + c5 + c6 = 0是精确匹配。 c1 + c2 + c3 + c4 + c5 + c6 = 1将发现6中的5个相同。等等。

你不希望这个模型持续很长时间......你可以更快地获得一些标准化数据。