过滤重复值,搜索对

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

我们有一个插件,可以将 XML 文件从 FTP 服务器导入到数据库中。该 XML 被进一步处理,数据被插入到数据库表中。这些行被添加到“定价”表中(在 10k+ 行包的帮助下),可以在其中设置价格。我的问题是,在导入过程中经常会出现重复的值。系统会处理它们,但在配对期间,仅将第一个匹配项放入表中。

为了简化,有一个表格..重要的列是:ID、“SITE”列和 LINKED 列,其中 ID 附有感叹号(!)到 PK。 如何找到配对并过滤掉那些没有配对的配对或多次链接到同一 ID 的配对?

此后,我想制定一个程序来更新列以修复配对 - 使用正确的 ID。

表:

enter image description here 我给这些对着色了,以便更容易想象和理解问题所在。在这里您可以看到,SITE:292 ID:4 未与 ID:6 配对。

我没有想法,我怎样才能链接正确的..我可以通过子选择找到不好的:

select * from pricing p where p.PK='3452400012026' and p.site='292' and (select count(*) from pricing po where po.PK = p.PK and po.LINKED=p.PK||'!'||p.ID) != 1

所以如果不是1,那就有问题了...

sql oracle oracle11g
1个回答
0
投票

您可以使用

ROW_NUMBER

分析对行进行编号,以查找

pk
id
linked
的每个组合的重复项。
要查找未引用的行,您可以将 

linked

列拆分为

linked_pk
字符之前和之后的
linked_site
!
子字符串,然后使用分层查询连接到父行。如果存在没有连接的行,那么它们是不匹配的。
您可以将其合并为一个查询:

WITH links (pk, id, site, linked, linked_pk, linked_site, rn) AS ( SELECT pk, id, site, linked, SUBSTR(linked, 1, INSTR(linked, '!') - 1), SUBSTR(linked, INSTR(linked, '!') + 1), ROW_NUMBER() OVER ( PARTITION BY pk, id, linked ORDER BY ROWNUM ) FROM pricing ) SELECT pk, id, site, linked FROM links l WHERE CONNECT_BY_ISLEAF = 1 CONNECT BY PRIOR pk = linked_pk AND PRIOR site = linked_site AND rn = 1 GROUP BY pk, id, site, linked HAVING MAX(LEVEL) = 1;

对于样本数据:

CREATE TABLE pricing (pk, id, site, linked) AS SELECT '123', 99, 1, '345!2' FROM DUAL UNION ALL SELECT '123', 99, 3, '345!8' FROM DUAL UNION ALL SELECT '123', 99, 5, '345!7' FROM DUAL UNION ALL SELECT '123', 99, 6, '345!8' FROM DUAL UNION ALL SELECT '123', 99, 9, '345!10' FROM DUAL UNION ALL SELECT '345', 292, 2, NULL FROM DUAL UNION ALL SELECT '345', 292, 4, NULL FROM DUAL UNION ALL SELECT '345', 292, 7, NULL FROM DUAL UNION ALL SELECT '345', 292, 8, NULL FROM DUAL UNION ALL SELECT '345', 292, 10, NULL FROM DUAL;

输出:

PK123345
身份证 网站 已链接
99 6 345!8
292 4
小提琴

© www.soinside.com 2019 - 2024. All rights reserved.