【发布时间】:2020-02-04 00:45:17
【问题描述】:
我想比较两个不同 Oracle 表的具有逗号分隔值的两列(差异表)的值。我想查找与所有值匹配的行(NAME1 所有值都应与 NAME2 值匹配)。
注意:逗号分隔值的顺序不同。
例子:
T1:
ID_T1 NAME1
===================================
1 ASCORBIC ACID, PARACETAMOL, POTASSIUM HYDROGEN CARBONATE
2 SODIUM HYDROGEN CARBONATE, SODIUM CARBONATE ANHYDROUS, CITRIC ACID
3 CAFFEINE, PARACETAMOL PH. EUR.
4 PSEUDOEPHEDRINE HYDROCHLORIDE,DEXCHLORPHENIRAMINE MALEATE
5 PARACETAMOL, DEXTROMETHORPHAN, PSEUDOEPHEDRINE, PYRILAMINE
T2:
ID_T2 NAME2
=================================
4 POTASSIUM HYDROGEN CARBONATE, ASCORBIC ACID, PARACETAMOL
5 SODIUM HYDROGEN CARBONATE, SODIUM CARBONATE ANHYDROUS
6 PARACETAMOL PH. EUR.,CAFFEINE
7 CODEINE PHOSPHATE, PARACETAMOL DC
8 DEXCHLORPHENIRAMINE MALEATE, DEXTROMETHORPHAN HYDROBROMIDE
10 DEXCHLORPHENIRAMINE MALEATE, PSEUDOEPHEDRINE HYDROCHLORIDE
11 PARACETAMOL, DEXTROMETHORPHAN, PSEUDOEPHEDRINE, PYRILAMINE1
MY RESULT 应该只显示基于两个表中的 ALL NAME 匹配的匹配行。
ID_T1 ID_T2 MATCHING NAME
==================================
1 4 POTASSIUM HYDROGEN CARBONATE, ASCORBIC ACID, PARACETAMOL
3 6 PARACETAMOL PH. EUR.,CAFFEINE
4 10 PSEUDOEPHEDRINE HYDROCHLORIDE,DEXCHLORPHENIRAMINE MALEATE
现有成员@Goran 下面提供了部分解决方案,以下解决方案适用于除最后一行以外的所有值。下面的解决方案是找到 T1 的第 5 行与 T2 的第 11 行的匹配这是错误的,因为 T2 的最后一行值是“PYRILAMINE1”,它是 到 T1 最后一行值“PYRILAMINE”
部分解决方案:
SELECT
T1.ID_T1,
T2.ID_T2,
T1.NAME1
FROM
T1
JOIN T2 ON TRIM('#' FROM TRANSLATE(T1.NAME1, T2.NAME2, '#')) IS NULL
AND TRANSLATE(T1.NAME1, T2.NAME2, '#') IS NOT NULL
AND REGEXP_COUNT(T1.NAME1, ',') = REGEXP_COUNT(T2.NAME2, ',');
【问题讨论】:
-
所谓的“部分解决”是100%错误的。例如,它将匹配字符串
'CALCIUM CARBONATE, SODIUM NITRATE'和字符串'CALCIUM NITRATE, SODIUM CARBONATE'。你从哪里找到这个所谓的“解决方案”? -
澄清问题。我看到在大多数情况下,每个逗号后面都有一个空格,但也有一些例外。这是您的错字,还是您实际上在数据中观察到了这一点?如果您确实在数据中看到此类异常,“名称”是否也可能不是全大写?名字有可能有错别字吗?所有这些异常都可能导致查询中出现“不正确”的结果。这只是数据模型中的许多致命弱点之一(它违反了第一范式,这是一个好的数据模型的最基本要求)。
-
@mathguy: 1) 是的,大多数值都有空格。 2) 大多数名字都用大写字母 3) 这是我们拥有的数据模型,它不是我创建的。
-
请不要发布重复的问题。如果您不喜欢对 your previous question 的回复,请对那里的答案发表评论和/或编辑您的问题以解释您还需要什么。
-
@APC2:对不起,下次我会按照你的指示去做。
标签: regex database oracle plsql