我有两张桌子,如下所示:
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 | 林纳姆 |
---|---|---|
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 中如何做到这一点。
您并不是要求它过滤掉不匹配的 (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
对您的查询的一些评论:
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);