Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL只获取不匹配的列_Sql_Oracle_Testing_Etl - Fatal编程技术网

SQL只获取不匹配的列

SQL只获取不匹配的列,sql,oracle,testing,etl,Sql,Oracle,Testing,Etl,我想知道在进行批量测试时,我们是否只能从表中获取不匹配的数据集。请查看以下示例: 如果下表是我的目标表,如果数据加载正确,我将执行测试,我将编写一个SQL从源中选择列,并对目标表进行减号,如果假设源具有XXX as 2000的sal,则源与目标不匹配,是否可以仅获取id和sal列作为减号查询的输出 要清楚的是,如果我有一个有100列的表要做测试,减号查询将返回所有100列,即使1列中存在不匹配,所以我只希望返回1列,其中有不匹配的 id Name sal -- ---- ---- 1 X

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

如果下表是我的目标表,如果数据加载正确,我将执行测试,我将编写一个SQL从源中选择列,并对目标表进行减号,如果假设源具有XXX as 2000的
sal
,则源与目标不匹配,是否可以仅获取id和sal列作为减号查询的输出

要清楚的是,如果我有一个有100列的表要做测试,减号查询将返回所有100列,即使1列中存在不匹配,所以我只希望返回1列,其中有不匹配的

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

假设目标数据集位于“TargetTable”中,而源数据集位于“SourceTable”中;或许您可以尝试以下方式:

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)))

根据以下假设:

  • 您仅比较源和目标的sal列
  • 源和目标基于id主键连接
  • 查询可以写为:

    SELECT
            T1.Name, T1.sal, S1.sal
    FROM
            schemaName.TargetTable T1, 
            schemaName.SourceTable S1
    WHERE 
            T1.id = S1.id
            AND T1.sal <> S1.sal
    
    选择
    T1.名称,T1.sal,S1.sal
    从…起
    schemaName.TargetTable T1,
    schemaName.SourceTable S1
    哪里
    T1.id=S1.id
    和T1.sal S1.sal
    
    具有以下假设

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

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


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

    哪一个DBMS?您自己尝试过什么?大家好,欢迎来到SO。请添加代码/查询的重要部分。阅读并提出一个更受欢迎的问题。@一匹没有名字的马oracle@davejal谢谢,是的,这是第一次。查询太长,无法发布,所以我只是解释了场景。我正在验证从测试环境(tedw)到产品环境(pedw)的表。。所以这个表有100列,需要找到不匹配的列,我用减号查询验证它,但它会导致所有列,即使一列和更多列中存在不匹配,我必须手动检查哪个列与减号查询结果不匹配。。。因此,我希望避免这种情况,只获取不匹配的列作为结果集。@harikamireddi您是否找到了一种有用的方法来执行此操作?我的select语句中有一个输入错误。感谢您的响应,将T2.sal更改为S1.salHi sid,但正如我所说,表中有80列需要比较,使用case语句真的可行吗
    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)