【问题标题】:SQL to get only the mismatches columnsSQL 仅获取不匹配的列
【发布时间】:2016-01-25 23:19:43
【问题描述】:

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

如果下表是我的目标表,如果数据加载正确,我将执行我的测试,如果假设源有 @ XXX 的 987654323@ 为 2000 那么这是从源到目标的不匹配,是否可以仅获取 id 和 sal 列作为减号查询的输出。

需要明确的是,如果我有一个包含 100 列的表来测试减号查询,即使 1 列不匹配,也会返回所有 100 列,所以我希望只返回 1 列不匹配的列。

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

【问题讨论】:

  • 您使用的是哪个 DBMS?
  • 你自己试过什么?嗨,欢迎来到 SO。请添加您的代码/查询的重要部分。阅读how to askmcve 以提出更受欢迎的问题。
  • @a_horse_with_no_name 它在 oracle 中
  • @davejal 谢谢,是的,这是第一次。查询太长无法发布,所以我只是解释了这个场景。我正在验证从测试环境(tedw)到生产环境(pedw)的表。所以该表有 100 列并且需要找到不匹配的列,我正在使用减号查询对其进行验证,但它会导致所有列即使有一列不匹配,而且我必须手动检查哪一列与减号查询结果不匹配......所以我想避免这种情况,只将不匹配的列作为我的结果集。
  • @harikamireddi 你找到有用的方法了吗

标签: sql oracle testing etl


【解决方案1】:

基于以下假设

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

然后可以使用 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 语句会告诉哪一行导致了不匹配

【讨论】:

  • 您好,感谢您的回复,但正如我所说,表中有 80 列需要比较,用 case 语句真的可行吗
【解决方案2】:

假设您的目标数据集在“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)))

【讨论】:

    【解决方案3】:

    有以下假设:

    1. 您只是比较源和目标的 sal 列
    2. 源和目标基于 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
    

    【讨论】:

    • 我的选择语句中有错字。将 T2.sal 更改为 S1.sal
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多