我有一个Oracle数据库应用程序,该应用程序创建重复记录列表,供用户查看,用户可以删除、保留或标记不同的记录(合法副本)。我需要报告这个队列中的记录数量。挑战是合法的副本,因为这些副本保存在第二个数据表上,并作为每对标记(a≠b)的两行保存。但是,由于重复组可以包含多个重复项,而且记录可以标记为合法副本,因此我需要从候选组中的所有其他记录中删除标记为合法副本的记录。希望这是有意义的。
因此,这两个表的简化视图将是:重复候选
Group Key
Dup-1 123
Dup-1 234
Dup-2 123
Dup-2 345
Dup-2 567
Dup-3 234
Dup-3 567
Dup-4 123
Dup-4 567
Dup-4 235合法副本:
Group Key
A 123
A 234
B 345
B 456
C 123
C 567
D 123
D 235我想从这个例子中返回的结果是:
重复候选人
Group Key
Dup-2 123
Dup-2 345
Dup-2 567
Dup-3 234
Dup-3 567
Dup-4 567
Dup-4 235Dup-1不会作为合法的A组有两个密钥返回,而Dup-2将被返回,而键123和345都被标记为合法的副本,它们目前没有被标记为彼此不同。应该再次返回Dup-3,因为这两个记录没有被标记为合法的副本。最后,不应该返回DUP-4123行,因为它被标记为组中两个其他记录的合法副本,但是应该返回它们,因为它们不是彼此的合法副本。
我确实需要在SQL中实现这一点,因为我将直接将这些数据输入报告解决方案(Business或Tablaux)。有人能在这件事上给我一个正确的方向吗。不幸的是,我们的软件完全是黑匣子,所以我无法从为用户处理此问题的代码中反向工程。
发布于 2022-02-08 10:14:42
使用存在。如果该组中至少有一名其他成员也是成员,则返回该候选人。
select *
from Candidates c
where exists (
select 1
from Candidates c2
where c2.Grp = c.Grp and c2.Key <> c.Key
and not exists (
select 1
from Legitimate l
where l.Key = c.Key
and exists (
select 1
from Legitimate l2
where l2.Grp = l.Grp and l2.Key = c2.Key
)
)
)
order by Grp, Keyhttps://stackoverflow.com/questions/71031276
复制相似问题