Oracle 比较两个表之间的数据

问题描述 投票:0回答:2

我有两张桌子,如下所示:

表1:

PP CP 林纳姆
4610-A4N3C-K0235 18961-060 900000021
4610-A4N3C-K0235 22873 900000028
4610-A4N3C-K0235 23282-10 900000038
4610-A4N3C-K0235 23282-10 900000044

表2:

PP CP 林纳姆
4610-A4N3C-K0235 18961-060 900000021
4610-A4N3C-K0235 22873 900000028
4610-A4N3C-K0235 23282-10 900000038
4610-A4N3C-K0235 23282-10 900000044

我正在使用以下查询来比较两个表中的 PP、CP 列,并检查 linnum 是否匹配。我在两个表中总共有 126 个条目,并且期望输出有 126 个条目。

select a.pp,a.cp,a.linnum,b.pp,b.pp,b.linnum,
case when a.pp=b.pp and a.cp=b.cp and a.linnum=b.linnum then 'Y' Else 'N' end matchnomatch
from tt1 a inner join tt2 b
on (a.pp=b.pp and a.cp=b.cp);

输出:

A.PP A.CP A.林纳姆 B.PP B.CP B.LINNUM 匹配不匹配
4610-A4N3C-K0235 18961-060 900000021 4610-A4N3C-K0235 18961-060 900000021
4610-A4N3C-K0235 22873 900000028 4610-A4N3C-K0235 22873 900000028
4610-A4N3C-K0235 23282-10 900000038 4610-A4N3C-K0235 23282-10 900000038
4610-A4N3C-K0235 23282-10 900000044 4610-A4N3C-K0235 23282-10 900000038 N
4610-A4N3C-K0235 23282-10 900000038 4610-A4N3C-K0235 23282-10 900000044 N
4610-A4N3C-K0235 23282-10 900000044 4610-A4N3C-K0235 23282-10 900000044

虽然两个表中的所有内容都匹配,但我得到 292 个条目作为输出,甚至 N 作为 matchnomatch 列中的输出。最好的方法是什么?

我期待单独的输出 预期输出:

A.PP A.CP A.林纳姆 B.PP B.CP B.LINNUM 匹配不匹配
4610-A4N3C-K0235 18961-060 900000021 4610-A4N3C-K0235 18961-060 900000021
4610-A4N3C-K0235 22873 900000028 4610-A4N3C-K0235 22873 900000028
4610-A4N3C-K0235 23282-10 900000038 4610-A4N3C-K0235 23282-10 900000038
4610-A4N3C-K0235 23282-10 900000044 4610-A4N3C-K0235 23282-10 900000044

如果 linnum 与 pp 和 cp 匹配并不真正匹配,它应该给出 N。在 oracle sql 中如何做到这一点。

oracle left-join
2个回答
0
投票

您并不是要求它过滤掉不匹配的 (N) 行。您只需设置一个列值来报告匹配 (Y) 或不匹配 (N)。它正在按照您的要求进行操作。要过滤,请使用

WHERE
子句:

select a.pp,a.cp,a.linnum,b.pp,b.pp,b.linnum,
      'Y' matchnomatch -- no need for case logic here
from tt1 a inner join tt2 b
on (a.pp=b.pp and a.cp=b.cp)
where a.linnum != b.linnum -- this will filter the results

0
投票

对您的查询的一些评论:

select a.pp,a.cp,a.linnum,b.pp,b.pp,b.linnum,
case when a.pp=b.pp and a.cp=b.cp and a.linnum=b.linnum then 'Y' Else 'N' end matchnomatch
from tt1 a inner join tt2 b
on (a.pp=b.pp and a.cp=b.cp);

它返回的每一行都必须在 b 个表中具有相同的 pp 和 cp,因此显示它们是没有用的。在你的案例陈述中比较它们也是没有用的。 如果你想调整 linnum 相同的行,那么使用这个

select a.pp,a.cp,a.linnum
from tt1 a inner join tt2 b
on (a.pp=b.pp and a.cp=b.cp and a.linnum=b.linnum);
© www.soinside.com 2019 - 2024. All rights reserved.