SQL只获取不匹配列

时间:2016-01-25 23:19:44

标签: sql oracle testing etl

我想知道在进行体积测试时是否只能从表中获取不匹配的数据集,请查看以下示例:

如果下面的表是我执行测试的目标表,如果数据被正确加载,我会编写一个SQL来从源中选择列并对目标表执行减号,如果让我们说的话源为{2000}的sal为2000,然后从源到目标不匹配,是否可以只将id和sal列作为减号查询的输出。

要清楚我是否有一个包含100列的表来进行测试,即使1列中存在不匹配,也会返回所有100列,因此我只想返回1列不匹配的列。 / p>

id  Name sal
--  ---- ----
1   XXX 1000
2   YYY 2000
3   ZZZ 4000
4   AAA 5000

3 个答案:

答案 0 :(得分:2)

以下假设

源表和目标表都有一个共同的主键

然后可以使用case语句缩小导致不匹配的确切列

http://sqlfiddle.com/#!2/a78eca/16

select 
ST.id,
case 
when ST.name!=TT.name then 'Issue in name' 
When ST.sal!=TT.sal then 'Issue in Sal'
Else 'OK' END As Check_Column
From source_table ST, Target_table TT
where ST.id=TT.id
and (ST.name!=TT.name OR ST.sal!=TT.sal)

上面的解释是where条件只过滤掉有问题的行,case语句会告诉哪一行导致不匹配

答案 1 :(得分:0)

假设您的目标数据集位于' TargetTable'并且您的源数据集位于' SourceTable&#39 ;;也许你可以尝试类似的东西:

SELECT Name, Sal FROM TargetTable as t
WHERE (NOT EXISTS 
    (SELECT Name, Sal from SourceTable as s
     WHERE(Name = t.Name) OR (Sal = t.Sal)))

答案 2 :(得分:0)

有以下假设:

  1. 您只是比较来源和目标
  2. 的sal列
  3. 根据ID主键
  4. 加入源和目标

    查询可以写成:

    SELECT
            T1.Name, T1.sal, S1.sal
    FROM
            schemaName.TargetTable T1, 
            schemaName.SourceTable S1
    WHERE 
            T1.id = S1.id
            AND T1.sal <> S1.sal