我们有一个插件,可以将 XML 文件从 FTP 服务器导入到数据库中。该 XML 被进一步处理,数据被插入到数据库表中。这些行被添加到“定价”表中(在 10k+ 行包的帮助下),可以在其中设置价格。我的问题是,在导入过程中经常会出现重复的值。系统会处理它们,但在配对期间,仅将第一个匹配项放入表中。
为了简化,有一个表格..重要的列是:ID、“SITE”列和 LINKED 列,其中 ID 附有感叹号(!)到 PK。 如何找到配对并过滤掉那些没有配对的配对或多次链接到同一 ID 的配对?
此后,我想制定一个程序来更新列以修复配对 - 使用正确的 ID。
表:
我给这些对着色了,以便更容易想象和理解问题所在。在这里您可以看到,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,那就有问题了...
您可以使用
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;
输出:
身份证 | 网站 | 已链接 | |
---|---|---|---|
99 | 6 | 345!8 | |
292 | 4 |