SQL 查询生成重复项

SQL Query generates duplicates

我目前正在 ODI 中开发 ETL 过程。源文件具有以下形状:

| MPS_OPERATIVA | MPS_DETALLEOPERATIVA                     | RAM_ID | RAM_ALIAS  | RAM_NOMBRE                           | DATAPOOL               |
|---------------|------------------------------------------|--------|------------|--------------------------------------|------------------------|
| Anulaciones   | A Efecto - Desistimiento Cliente         | 41     | PENSIPLANP | PLANES DE PENSIONES INDIVIDUALES     | Vida Ahorro            |
| Anulaciones   | A Efecto - Desistimiento Cliente         | 656    | UNITLINK   | UNIT LINK-UNIT LINK                  | Vida Ahorro            |
| Anulaciones   | A Efecto - Desistimiento Cliente         | 278    | VIDAAHMIX  | VIDA AHORRO -MIXTOS                  | Vida Ahorro            |
| Anulaciones   | A Efecto - Desistimiento Cliente         | 281    | PIAS       | VIDA AHORRO -PIAS                    | Vida Ahorro            |
| Anulaciones   | A Efecto - Desistimiento Cliente         | 695    | VIDACAPDIF | VIDA AHORRO-CAPITAL DIFERIDO         | Vida Ahorro            |
| Anulaciones   | A Efecto - Desistimiento Cliente         | 275    | VIDAPURO   | VIDA RIESGO -VIDA PURO               | Vida riesgo            |
| Anulaciones   | A Efecto - Error Emisión                 | 41     | PENSIPLANP | PLANES DE PENSIONES INDIVIDUALES     | Vida Ahorro            |
| Anulaciones   | A Efecto - Error Emisión                 | 656    | UNITLINK   | UNIT LINK-UNIT LINK                  | Vida Ahorro            |
| Anulaciones   | A Efecto - Error Emisión                 | 278    | VIDAAHMIX  | VIDA AHORRO -MIXTOS                  | Vida Ahorro            |
| Anulaciones   | A Efecto - Error Emisión                 | 281    | PIAS       | VIDA AHORRO -PIAS                    | Vida Ahorro            |
| Anulaciones   | A Efecto - Error Emisión                 | 695    | VIDACAPDIF | VIDA AHORRO-CAPITAL DIFERIDO         | Vida Ahorro            |
| Anulaciones   | A Efecto - Error Emisión                 | 275    | VIDAPURO   | VIDA RIESGO -VIDA PURO               | Vida riesgo            |
| Anulaciones   | A Fecha - Cese o desaparición del riesgo | 309    | EMPOTROS   | EMPRESAS -OTROS SEGUROS Y SERVICIOS  | Resto Seguros Empresas |
| Anulaciones   | A Fecha - Cese o desaparición del riesgo | 309    | EMPOTROS   | EMPRESAS -OTROS SEGUROS Y SERVICIOS  | Resto Seguros Empresas |
| Anulaciones   | A Fecha - Cese o desaparición del riesgo | 309    | EMPOTROS   | EMPRESAS -OTROS SEGUROS Y SERVICIOS  | Resto Seguros Empresas |

我需要与源交叉的另一个文件具有以下形状:

| PK_RAMO | DES_RAMO_SFC                     | DES_RAMO_NEURONA                                                                 | DES_RAMO_DTP               |
|---------|----------------------------------|----------------------------------------------------------------------------------|----------------------------|
| 1       | BM Accidentes                    | ACCIDENTES; VIDAACCID                                                            | Accidentes                 |
| 2       | BM Autos y Motos                 | AUTOS; CAMIONES; MOTOS; VEHIFLOTAS                                               | Autos                      |
| 3       | BM Comercio                      | COMERCIOS                                                                        | Comercio                   |
| 4       | BM Construcción                  | CONSTRUCC                                                                        | Construcción               |
| 5       | BM Crédito                       | CAUCIONCTO                                                                       | Crédito                    |
| 6       | BM Decesos                       | DECESOS                                                                          | Decesos                    |
| 7       | BM Hogar                         | HOGAR                                                                            | Hogar                      |
| 8       | BM Leasing                       | LEASING                                                                          | Leasing                    |
| 9       | BM Multirriesgo Empresas         | PYMES;MERCANTIL                                                                  | Mult Empresas              |
| 10      | BM Planes Pensiones              | PENSIPLANP                                                                       | Pensiones                  |
| 11      | BM Protección de Pagos           | PROTPAGOS                                                                        | Prot de Pagos              |
| 12      | BM RC General                    | RCEMPRESA                                                                        | Resp. Civil                |
| 13      | BM Resto de Seguros Empresas     | AGROPEC; CASCOS;EMPOTROS;MAQUINARIA;TPTMERCAN                                    | Resto Seguros Empresas     |
| 14      | BM Resto de Seguros Particulares | ASISVIAJE;COMUNIDAD;GENOCIO;GENOTROS;HOGAROTROS;OTRASIST;OTROS;PROTFAMIL;RCFAMIL | Resto Seguros Particulares |
| 15      | BM Salud                         | ASISSANIT;INDEMNIZ;REEMBOLSO                                                     | Salud                      |
| 16      | BM Vida Ahorro                   | PIAS;PPA;VIDAAHMIX;VIDAAHOPU;VIDACAPDIF;VIDARENTA                                | Vida Ahorro                |
| 17      | BM Vida Riesgo Puro              | VIDAPURO                                                                         | Vida Riesgo                |
| 18      | BM Vida Riesgo Amortización      | VIDAOPFIN                                                                        | Vida Vinculado             |

两个文件都需要RAM_ALIAS = DES_RAMO_NEURONA交叉,但是,我很难做到。

我做了以下事情:

SELECT * FROM file21 t1
LEFT JOIN file2 t2
-- Searching the word in the other file
ON t1.ram_alias = SUBSTR(t2.des_ramo_neurona, INSTR(t2.des_ramo_neurona, t1.ram_alias), LENGTH(t1.ram_alias))
-- Special Cases
WHERE ((SUBSTR(t2.des_ramo_neurona, INSTR(t2.DES_RAMO_NEURONA, t1.RAM_ALIAS), (LENGTH(t1.RAM_ALIAS) + 1)) = CONCAT(t1.RAM_ALIAS,';')) 
OR (SUBSTR(t2.des_ramo_neurona, INSTR(t2.DES_RAMO_NEURONA, t1.RAM_ALIAS), (LENGTH(t1.RAM_ALIAS) + 1)) = CONCAT(t1.RAM_ALIAS,'')) 
OR (t2.des_ramo_neurona IS NULL))

但是,在执行此操作时,由于某些单词包含单词 'OTROS',我生成了重复项。如您所见,单词 'OTROS' 可以包含在其他单词中,例如 'EMPOTROS' 或 'GENOTROS'.

拜托,您知道如何解决这个问题,或者您对如何执行此 SQL 查询有更好的想法吗?

提前致谢

匹配整个术语并包括前导和后续分隔符:

SELECT *
FROM   file21 t1
       LEFT JOIN file2 t2
       -- Searching the word in the other file
       ON ';' || t2.des_ramo_neurona || ';' LIKE '%;' || t1.ram_alias || ';%'

并且,如有必要,您可以使用以下方法替换分隔符后的单个空格:

SELECT *
FROM   file21 t1
       LEFT JOIN file2 t2
       -- Searching the word in the other file
       ON ';' || REPLACE(t2.des_ramo_neurona, '; ', ';') || ';'
          LIKE '%;' || t1.ram_alias || ';%'