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 || ';%'
我目前正在 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 || ';%'