oracle 查询返回JSON clob上的重复值

qqrboqgw  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(124)

上下文:

我有这个表,填充了数千个条目:

CREATE TABLE PRICING_TAXAS.FATURAMENTOS_MCC
(
    ID_FATURAMENTO_MCC NUMBER(20) not null,
    ID_MCC NUMBER(20) NOT NULL,
    FATURAMENTO_INI NUMBER(18,2),
    FATURAMENTO_FINAL NUMBER(18,2),
    CONSTRAINT faturamento_mcc_pk primary key (ID_FATURAMENTO_MCC)
);

'FATURAMENTO_INI'和'FATURAMENTO_FINAL'是货币值,分别表示起始值和结束值。
每个“ID_MCC”对具有不同范围的起始和结束货币值,并且这些对中的每个被分配给pk“ID_FATURAMENTO_MCC”。
然后,我从Spring Service收到了这个查询:

select  
    ftmcc.id_mcc as idMcc, 
    ( 
        JSON_ARRAYAGG 
        ( 
            JSON_OBJECT 
            ( 
                'idFaturamentoMcc' VALUE ftmcc.id_faturamento_mcc, 
                'faturamentoInicial' VALUE ftmcc.faturamento_ini, 
                'faturamentoFinal' VALUE ftmcc.faturamento_final 
            ) RETURNING CLOB 
        ) 
    ) as faturamentos 
from  
    FATURAMENTOS_MCC ftmcc 
join  
    MCC mcc 
on  
    mcc.mcc_cod in :#{#searchDTO.mccCodes} 
join  
    GRUPOMCC_ITEM gMccItem 
on  
    gMccItem.id_mcc = mcc.id_mcc 
where 
    ( 
        COALESCE(:#{#searchDTO.monthlyGrossIncome}, NULL) IS NULL 
        OR 
        ( 
            ftmcc.faturamento_ini <= TO_NUMBER(:#{#searchDTO.monthlyGrossIncome}) 
            AND 
            ftmcc.faturamento_final >= TO_NUMBER(:#{#searchDTO.monthlyGrossIncome}) 
        ) 
    ) 
group by ftmcc.id_mcc

'MCC'是接收参数'mccCodes'并返回id的表。然后将此id作为外键(n到n)与表“GRUPOMCC_ITEM”配对,返回一个id列表。此id列表是在表“FATURAMENTOS_MCC”中搜索的“id_mcc”列。'FATURAMENTOS_MCC'表也由参数'monthlyGrossIncome'过滤,以将货币范围限制为适合通知的货币的范围。
因此,考虑到“FATURAMENTOS_MCC”上的每个“id_mcc”可以有许多货币范围的组合,但每个组合都是唯一的,因此该服务应仅返回每个id_mdd的1个组合。
但出于某种原因,它返回了这个:

[
    {
        "idMcc": 44565,
        "faturamentos": [
            {
                "idFaturamentoMcc": 2827,
                "faturamentoInicial": 5000,
                "faturamentoFinal": 19999
            },
            {
                "idFaturamentoMcc": 2827,
                "faturamentoInicial": 5000,
                "faturamentoFinal": 19999
            },
            {
                "idFaturamentoMcc": 2827,
                "faturamentoInicial": 5000,
                "faturamentoFinal": 19999
            },
            {
                "idFaturamentoMcc": 2827,
                "faturamentoInicial": 5000,
                "faturamentoFinal": 19999
            },

“idMcc”没有被重复,这很好,但是货币范围被重复。
有发现吗
我尝试在JSON构建器上使用DISTINCT,但没有成功。

uujelgoq

uujelgoq1#

为了避免这种重复,可以使用子查询首先聚合每个idMcc的货币范围,然后将此子查询与MCC和GRUPOMCC_ITEM表联接。以下是如何修改查询的示例:

SELECT
    mcc.id_mcc AS idMcc,
    (
        SELECT JSON_ARRAYAGG(
            JSON_OBJECT(
                'idFaturamentoMcc' VALUE ftmcc.id_faturamento_mcc,
                'faturamentoInicial' VALUE ftmcc.faturamento_ini,
                'faturamentoFinal' VALUE ftmcc.faturamento_final
            ) RETURNING CLOB
        )
        FROM FATURAMENTOS_MCC ftmcc
        WHERE ftmcc.id_mcc = mcc.id_mcc
        AND (
            COALESCE(:#{#searchDTO.monthlyGrossIncome}, NULL) IS NULL
            OR (
                ftmcc.faturamento_ini <= TO_NUMBER(:#{#searchDTO.monthlyGrossIncome})
                AND
                ftmcc.faturamento_final >= TO_NUMBER(:#{#searchDTO.monthlyGrossIncome})
            )
        )
    ) AS faturamentos
FROM MCC mcc
JOIN GRUPOMCC_ITEM gMccItem ON gMccItem.id_mcc = mcc.id_mcc
WHERE mcc.mcc_cod IN :#{#searchDTO.mccCodes}
GROUP BY mcc.id_mcc;

这应该可以防止JSON结果中的货币范围重复,因为每个idMcc只与其唯一的货币范围集相关联。

相关问题