Tempo aproximado para leitura: 00:03:00 min
Ocorrência
Ao tentar executar uma consulta em Visões de Dados é apresentada a mensagem Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <=, >, >= or when the subquery is used as an expression.
Ambiente
Cross Segmentos - TOTVS Backoffice (Linha RM) - RM BI – Todas as versões
Causa
Esta mensagem de erro aparece quando você tenta utilizar uma subconsulta (correlacionada ou não) que retorna mais de um valor para a consulta chamadora. Isso geralmente indica que há entradas duplicadas na coluna de uma tabela onde se espera que sejam exclusivas. Um dos motivos pelos quais isso pode ocorrer é se a coluna da tabela afetada não estiver restrita a identificadores exclusivos.
Em resumo, o erro relacionado a subquery ocorre quando uma subconsulta (consulta dentro de outra) não retorna os dados no formato esperado pela instrução principal. Um dos erros mais comuns é quando a subquery deveria retornar apenas um único valor (linha e coluna), mas retorna vários, o que gera conflito na execução da consulta.
Esse tipo de erro geralmente está relacionado ao uso incorreto da subquery em cláusulas como WHERE, SELECT ou SET, onde é exigido um único resultado. Para corrigir, é necessário revisar a subconsulta e garantir que ela esteja devidamente filtrada ou ajustada para retornar apenas o valor necessário ao contexto.
Solução
Para solucionar essa ocorrência, realize os seguintes passos:
1. Acesse o Menu Visões de Dados;
2. Localize a consulta através do código;
3. Edite a consulta localizada e analise se o Subselect está retornando mais de um resultado, para isso execute somente o Select retornado após a condição Where. Com base no resultado aplique as devidas correções para que o resultado retorne apenas uma linha.
Exemplificando
A consulta SQL abaixo:
SELECT NOME, MATRICULA, CODCCUSTO
FROM PFUNC
WHERE CODCCUSTO = (
SELECT CODCCUSTO
FROM PFUNC
WHERE MATRICULA = '12345'
);
Geraria o erro referente ao retorno de subquery se:
A subquery:
SELECT CODCCUSTO
FROM PFUNC WHERE MATRICULA = '12345'
Retornar mais de uma linha. Ou seja:
Se houver mais de um registro com a matrícula '12345' na tabela PFUNC, e esses registros tiverem valores de CODCCUSTO diferentes (ou iguais, mas ainda assim múltiplos registros), a subquery não será considerada escalar (de linha única) e causará erro.
Por que isso acontece?
A cláusula = espera apenas um único valor à direita.
Quando a subquery retorna 2 ou mais valores, o Oracle não sabe com qual deles comparar, e lança o erro.
Como evitar esse erro:
Garantir que a subquery retorne uma única linha, por exemplo:
SELECT MAX(CODCCUSTO)
FROM PFUNC
WHERE MATRICULA = '12345'
Ou mudar = para IN, se aceitar múltiplos valores:
WHERE CODCCUSTO IN (
SELECT CODCCUSTO
FROM PFUNC
WHERE MATRICULA = '12345'
)
Saiba mais
Acesse o link Mensagem Subquery onde demonstra algumas dicas de como identificar o campo que traz mais de um valor.
0 Comentários