我想比较具有两个不同 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, ',');