SQL只获取不匹配的列
我想知道在进行批量测试时,我们是否只能从表中获取不匹配的数据集。请查看以下示例: 如果下表是我的目标表,如果数据加载正确,我将执行测试,我将编写一个SQL从源中选择列,并对目标表进行减号,如果假设源具有XXX as 2000的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
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)))
根据以下假设:
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)