Ir para conteúdo
  • 0

Oracle: ORA-01427: single-row subquery returns more than one row.


Renan Lima Dias

Pergunta

  • Alunos

Bom dia pessoal,

Estou com esse erro no power bi quando faço atualização de uma base SQL.
Os dados estão rodando perfeitamente quando faço teste fora do Power bi,
mas no Bi ele esta puxando esse erro que está bloqueado os demais carregamentos também.
alguém pode me ajudar?
image.png.c4fc2a51ee6dfe771e8fc734405bae36.png

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0
  • Alunos

Uma resposta do nosso amigo chatgpt:

O erro "ORA-01427: single-row subquery returns more than one row" ocorre quando uma subquery, que deveria retornar apenas uma linha, retorna múltiplas linhas. Para resolver esse problema, é necessário identificar e ajustar as subqueries que estão causando o erro.

Na sua query, há várias subqueries que podem estar causando o problema. Aqui estão os passos para identificar e resolver:

1. Verifique as subqueries: Cada subquery no `SELECT` deve retornar apenas uma linha. A seguir estão as subqueries presentes na sua query:

    ```sql
    (SELECT IDENTIFICADOR
     FROM IDENTIFICACAO_PESSOA
     WHERE CATEGORIA_IDENTIFICACAO_FK IN (1, 2)
       AND PESSOA_FK = P.ID)
    ```

    ```sql
    (SELECT IDENTIFICADOR
     FROM IDENTIFICACAO_PESSOA
     WHERE CATEGORIA_IDENTIFICACAO_FK IN (1, 2)
       AND PESSOA_FK = E.ID)
    ```

    ```sql
    (SELECT AM.VALOR AVARIADOS_TOTAL
     FROM RESULTADO_AMOSTRA AM
     JOIN PROPRIEDADE PRO ON PRO.ID = AM.PROPRIEDADE_FK
     WHERE IDENTIFICADOR = 'AVARIADOS_TOTAL'
       AND AM.AMOSTRA_FK = AAM.AMOSTRA_FK)
    ```

    E assim por diante para cada subquery.

2. **Execute cada subquery individualmente**: Para identificar qual subquery está retornando múltiplas linhas, execute-as separadamente no banco de dados com os mesmos filtros. Por exemplo:

    ```sql
    SELECT IDENTIFICADOR
    FROM IDENTIFICACAO_PESSOA
    WHERE CATEGORIA_IDENTIFICACAO_FK IN (1, 2)
      AND PESSOA_FK = [valor_específico_para_P.ID]
    ```

3. **Ajuste as subqueries para garantir que retornem uma única linha**: Você pode usar funções agregadas como `MAX`, `MIN`, ou `ROWNUM` para garantir que a subquery retorne apenas uma linha. Por exemplo:

    ```sql
    (SELECT MAX(IDENTIFICADOR)
     FROM IDENTIFICACAO_PESSOA
     WHERE CATEGORIA_IDENTIFICACAO_FK IN (1, 2)
       AND PESSOA_FK = P.ID)
    ```

    Ou:

    ```sql
    (SELECT IDENTIFICADOR
     FROM (SELECT IDENTIFICADOR
           FROM IDENTIFICACAO_PESSOA
           WHERE CATEGORIA_IDENTIFICACAO_FK IN (1, 2)
             AND PESSOA_FK = P.ID)
     WHERE ROWNUM = 1)
    ```

4. **Verifique os resultados após ajustar**: Após fazer as alterações, execute a query novamente para verificar se o erro foi resolvido.

Aqui está um exemplo de como ajustar uma das subqueries:

```sql
P.NOME || ' - ' || (SELECT MAX(IDENTIFICADOR)
                    FROM IDENTIFICACAO_PESSOA
                    WHERE CATEGORIA_IDENTIFICACAO_FK IN (1, 2)
                      AND PESSOA_FK = P.ID) AS PROPRIETARIO
```

Faça o mesmo para cada subquery que pode retornar múltiplas linhas. Verifique cada uma delas e ajuste conforme necessário.

Se precisar de mais ajuda para ajustar subqueries específicas, por favor, forneça exemplos dos dados para que eu possa oferecer uma solução mais detalhada.

  • Like 1
Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
1 hora atrás, Renan Lima Dias disse:

Bom dia pessoal,

Estou com esse erro no power bi quando faço atualização de uma base SQL.
Os dados estão rodando perfeitamente quando faço teste fora do Power bi,
mas no Bi ele esta puxando esse erro que está bloqueado os demais carregamentos também.
alguém pode me ajudar?
image.png.c4fc2a51ee6dfe771e8fc734405bae36.png

Bom dia isso parece ser um erro direto da sua query onde você está tentando encontrar mais de um valor para uma mesma linha. Sugiro dar uma olhada na sua query e usar uma clausula trazer valores únicos.

https://stackoverflow.com/questions/71200103/what-does-the-error-single-row-subquery-returns-more-than-one-row-means-and-ho#:~:text=ORA-01427%3A Cause%3A The,only one row is retrieved.

  • Like 1
Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos

o que você sugeriria de alteração para que não dê esse erro?
segue query abaixo :
 

SELECT
       EM.ID                                                                                        AS ID,
       MT2.IDENTIFICADOR                                                                            AS PLACA,
       --MT.IDENTIFICADOR                                                                             AS SEMIRREBOQUE,
       EM.USUARIO_CRIACAO                                                                           AS USUARIO_CRIACAO,
       EC.CHEGADA_TERMINAL                                                                          AS CHEGADA,
       EC.SAIDA_TRIAGEM                                                                             AS SAIDA_TRIAGEM,
       EC.RECEBIMENTO_TERMINAL                                                                      AS RECEBIMENTO,
       EC.LIBERACAO_TERMINAL                                                                        AS LIBERACAO,
       PE.DATA_PESAGEM                                                                              AS DATA_PESO_BRUTO,
       PE.USUARIO_CRIACAO                                                                           AS USUARIO_PESO_BRUTO,
       PE.VALOR_PESAGEM                                                                             AS PESO_BRUTO,
       CASE WHEN PE.INTERFACE_ATIVA = 1 THEN 'Automática' ELSE 'Manual' END                         AS TIPO_PESO_BRUTO,
       PS.DATA_PESAGEM                                                                              AS DATA_PESO_TARA,
       PS.USUARIO_CRIACAO                                                                           AS USUARIO_PESO_TARA,
       PS.VALOR_PESAGEM                                                                             AS PESO_TARA,
       CASE WHEN PS.INTERFACE_ATIVA = 1 THEN 'Automática' ELSE 'Manual' END                         AS TIPO_PESO_TARA,
       PE.VALOR_PESAGEM - PS.VALOR_PESAGEM                                                          AS PESO_LIQUIDO,
       D.IDENTIFICADOR                                                                              AS ORIGEM_DESTINO,
       NF.IDENTIFICADOR                                                                             AS NOTA,
       NF.SERIE                                                                                     AS SERIE,
       NF.EMISSAO                                                                                   AS EMISSAO,
       INF.QUANTIDADE                                                                               AS PESO_ORIGEM,
       INEC.QUANTIDADE_REALIZADA                                                                    AS PESO_REALIZADO,
       ROUND(100 - (INEC.QUANTIDADE_REALIZADA * 100 / INF.QUANTIDADE), 3)                           AS VARIACAO,
       P2.IDENTIFICADOR                                                                             AS PRODUTO,
       P.NOME || ' - ' || (SELECT IDENTIFICADOR
                           FROM IDENTIFICACAO_PESSOA
                           WHERE CATEGORIA_IDENTIFICACAO_FK IN (1, 2)
                             AND PESSOA_FK = P.ID)                                                  AS PROPRIETARIO,
       E.NOME || ' - ' || (SELECT IDENTIFICADOR
                           FROM IDENTIFICACAO_PESSOA
                           WHERE CATEGORIA_IDENTIFICACAO_FK IN (1, 2)
                             AND PESSOA_FK = E.ID)                                                  AS EMITENTE,
       EC.CHEGADA_TRIAGEM                                                                           AS CHEGADA_PATIO,
       to_char(to_date('1970-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') +
               (PE.DATA_PESAGEM - EC.CHEGADA_TRIAGEM), 'hh24:mi:ss')                                AS TEMPO_TRANSITO,
       to_char(to_date('1970-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') +
               (PS.DATA_PESAGEM - PE.DATA_PESAGEM), 'hh24:mi:ss')                                   AS TEMPO_TERMINAL,
       to_char(to_date('1970-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') +
               (PS.DATA_PESAGEM - COALESCE(EC.CHEGADA_TRIAGEM, EC.CHEGADA_TERMINAL)), 'hh24:mi:ss') AS TEF,
       EM.OBSERVACAO                                                                                AS OBSERVACAO,
       A2.OBSERVACAO                                                                                AS OBSERVACAO_CLASSIFICACAO,
       A2.DATA_COLETA                                                                               AS DATA_CLASSIFICACAO,
       A2.USUARIO_CRIACAO                                                                           AS USUARIO_CLASSIFICACAO,
       PROPRIEDADES_COLUNA.UMIDADE                                                                  AS UMIDADE,
       PROPRIEDADES_COLUNA.avariados_total                                                          AS AVARIDOS_TOTAL,
       PROPRIEDADES_COLUNA.partidos_quebrados                                                       AS PARTIDOS_QUEBRADOS,
       PROPRIEDADES_COLUNA.impureza                                                                 AS IMPUREZA, 
       PROPRIEDADES_COLUNA.ardidos_queimados                                                        AS ARDIDOS_QUEIMADOS,
       PROPRIEDADES_COLUNA.queimados                                                                AS QUEIMADOS,
       PROPRIEDADES_COLUNA.ardidos                                                                  AS ARDIDOS,
       PROPRIEDADES_COLUNA.esverdeados                                                              AS ESVERDEADOS,
       PROPRIEDADES_COLUNA.mofados                                                                  AS MOFADOS,
       PROPRIEDADES_COLUNA.picados                                                                  AS PICADOS,
       PROPRIEDADES_COLUNA.gmo                                                                      AS GMO
 
FROM ESTADA_MODAL EM
         INNER JOIN ESTADA_COMPOSICAO EC on EM.ID = EC.ID
         INNER JOIN MODAL_CARGA_COMPOSICAO MCC on EC.ID = MCC.ESTADA_COMPOSICAO_FK
         INNER JOIN MODAL_CARGA MC on MCC.MODAL_CARGA_FK = MC.ID
         INNER JOIN SEMI_REBOQUE SR on MC.ID = SR.ID
         INNER JOIN MODAL_TERRESTRE MT on MC.ID = MT.ID
         INNER JOIN ESTADA_COMPOSICA2MDS_LCMTR EC2ML on EC.ID = EC2ML.ESTADA_COMPOSICAO_FK
         INNER JOIN MODAL_LOCOMOTOR ML on EC2ML.MODAIS_LOCOMOTOR_FK = ML.ID
         INNER JOIN MODAL_TERRESTRE MT2 ON ML.ID = MT2.ID
         LEFT JOIN ITEM_NOTA_ESTADA_COMPOSICA INEC on EC.ID = INEC.ESTADA_COMPOSICAO_FK
         LEFT JOIN ITEM_NOTA_FISCAL INF on INEC.ITEM_NOTA_FISCAL_FK = INF.ID
         LEFT JOIN NOTA_FISCAL NF on INF.NOTA_FISCAL_FK = NF.ID
         LEFT JOIN PESSOA P on NF.PROPRIETARIO_CARGA_FK = P.ID
         LEFT JOIN PESSOA E ON E.ID = NF.EMITENTE_FK
         LEFT JOIN PRODUTO_GRANEL PG on INF.PRODUTO_GRANEL_FK = PG.ID
         LEFT JOIN PRODUTO P2 on PG.ID = P2.ID
         INNER JOIN PESAGEM_ESTADA_COMPOSICAO PEC on EC.PESAGEM_ENTRADA_FK = PEC.ID
         INNER JOIN PESAGEM_ESTADA_COMPOSICAO PEC2 ON PEC2.ID = EC.PESAGEM_SAIDA_FK
         INNER JOIN PESAGEM PE ON PE.ID = PEC.ID
         INNER JOIN PESAGEM PS ON PS.ID = PEC2.ID
         INNER JOIN ORIGEM_DESTINO_CARGA_TRMNL ODCT on EM.ORIGEM_DESTIN_CRG_TRMNL_FK = ODCT.ID
         INNER JOIN ORIGEM_DESTINO_DEPOSITO ODD on ODCT.ID = ODD.ID
         INNER JOIN DEPOSITO D on ODD.DEPOSITO_FK = D.ID
         INNER JOIN AMOSTRA_MODAL_TERMINAL AMT on EM.ID = AMT.ESTADA_MODAL_FK
         INNER JOIN AMOSTRA_ESTADA_MODAL AEM on AMT.ID = AEM.ID
         INNER JOIN AMOSTRA A2 on AEM.ID = A2.ID
         JOIN(SELECT AAM.AMOSTRA_FK, AAM.VALOR UMIDADE,
                  (SELECT AM.VALOR AVARIADOS_TOTAL
                      FROM RESULTADO_AMOSTRA AM
JOIN PROPRIEDADE PRO ON PRO.ID = AM.PROPRIEDADE_FK
WHERE IDENTIFICADOR = 'AVARIADOS_TOTAL'
AND AM.AMOSTRA_FK = AAM.AMOSTRA_FK) AVARIADOS_TOTAL,

(SELECT AM.VALOR PARTIDOS_QUEBRADOS
FROM RESULTADO_AMOSTRA AM
JOIN PROPRIEDADE PRO ON PRO.ID = AM.PROPRIEDADE_FK
WHERE IDENTIFICADOR = 'PARTIDOS_QUEBRADOS'
AND AM.AMOSTRA_FK = AAM.AMOSTRA_FK) PARTIDOS_QUEBRADOS,

nvl((SELECT AM.VALOR IMPUREZA
FROM RESULTADO_AMOSTRA AM
JOIN PROPRIEDADE PRO ON PRO.ID = AM.PROPRIEDADE_FK
WHERE IDENTIFICADOR = 'IMPUREZA'
AND AM.AMOSTRA_FK = AAM.AMOSTRA_FK),0) IMPUREZA,

(SELECT AM.VALOR ARDIDOS_QUEIMADOS
FROM RESULTADO_AMOSTRA AM
JOIN PROPRIEDADE PRO ON PRO.ID = AM.PROPRIEDADE_FK
WHERE IDENTIFICADOR = 'PARTIDOS_QUEBRADOS'
AND AM.AMOSTRA_FK = AAM.AMOSTRA_FK) ARDIDOS_QUEIMADOS,

(SELECT AM.VALOR QUEIMADOS
FROM RESULTADO_AMOSTRA AM
JOIN PROPRIEDADE PRO ON PRO.ID = AM.PROPRIEDADE_FK
WHERE IDENTIFICADOR = 'QUEIMADOS'
AND AM.AMOSTRA_FK = AAM.AMOSTRA_FK) QUEIMADOS,

(SELECT AM.VALOR ARDIDOS
FROM RESULTADO_AMOSTRA AM
JOIN PROPRIEDADE PRO ON PRO.ID = AM.PROPRIEDADE_FK
WHERE IDENTIFICADOR = 'ARDIDOS'
AND AM.AMOSTRA_FK = AAM.AMOSTRA_FK) ARDIDOS,

(SELECT AM.VALOR ESVERDEADOS
FROM RESULTADO_AMOSTRA AM
JOIN PROPRIEDADE PRO ON PRO.ID = AM.PROPRIEDADE_FK
WHERE IDENTIFICADOR = 'ESVERDEADOS'
AND AM.AMOSTRA_FK = AAM.AMOSTRA_FK) ESVERDEADOS,

nvl((SELECT AM.VALOR MOFADOS
FROM RESULTADO_AMOSTRA AM
JOIN PROPRIEDADE PRO ON PRO.ID = AM.PROPRIEDADE_FK
WHERE IDENTIFICADOR = 'MOFADOS'
AND AM.AMOSTRA_FK = AAM.AMOSTRA_FK),0) MOFADOS,

nvl((SELECT AM.VALOR PICADOS
FROM RESULTADO_AMOSTRA AM
JOIN PROPRIEDADE PRO ON PRO.ID = AM.PROPRIEDADE_FK
WHERE IDENTIFICADOR = 'PICADOS'
AND AM.AMOSTRA_FK = AAM.AMOSTRA_FK),0) PICADOS,

nvl((SELECT AM.VALOR GMO
FROM RESULTADO_AMOSTRA AM
JOIN PROPRIEDADE PRO ON PRO.ID = AM.PROPRIEDADE_FK
WHERE IDENTIFICADOR = 'GMO'
AND AM.AMOSTRA_FK = AAM.AMOSTRA_FK),0) GMO

FROM RESULTADO_AMOSTRA AAM
JOIN PROPRIEDADE PRO ON PRO.ID = AAM.PROPRIEDADE_FK
WHERE IDENTIFICADOR = 'UMIDADE') PROPRIEDADES_COLUNA
   ON PROPRIEDADES_COLUNA.AMOSTRA_FK = A2.ID
   
WHERE EM.CANCELAMENTO IS NULL
  AND EC.LIBERACAO_TERMINAL >= to_date('2024-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss')

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos

Olá @Renan Lima Dias, este erro acontece geralmente quando algum subselect está retornando mais de um valor, para corrigir isso você pode verificar as ligações do JOIN ou colocar dentro do subselect a expressão: AND ROWNUM = 1, essa expressão força que ele retorne somente uma linha e assim mitiga este erro.

Espero ter ajudado 

  • Like 1
Link para o comentário
Compartilhar em outros sites

Faça login para comentar

Você vai ser capaz de deixar um comentário após fazer o login



Entrar Agora
×
×
  • Criar Novo...