Tempo aproximado para leitura: 00:03:00 min
Dúvida
Qual o significado dos erros abaixo referentes a SUBQUERY ao gerar relatórios no Reports?
ORA-01427: single-row subquery returns more than one row
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
Solução
ORA-01427: single-row subquery returns more than one row ocorre quando uma subquery
Subconsulta usada em um contexto que espera um único valor retorna múltiplas linhas. Isso normalmente acontece em cláusulas como WHERE, SELECT, ou SET quando um valor único é esperado.
Exemplos de causas comuns:
Erro - Subquery Retornando Múltiplas Linhas
SELECT nome, (SELECT cidade FROM clientes) FROM pedidos;
Se a subquery SELECT cidade FROM clientes retornar mais de uma linha, o erro ocorre.
Solução - Use LIMIT 1 (se aplicável) ou funções como MIN(), MAX(), ou AVG() para garantir um único valor
SELECT nome, (SELECT MIN(cidade) FROM clientes) FROM pedidos;
Ou reformule a consulta para um JOIN:
SELECT p.nome, c.cidade FROM pedidos p JOIN clientes c ON p.cliente_id = c.id;
Uso indevido em Cláusula WHERE:
Erro - Se mais de um cliente da cidade de São Paulo existir, o erro ocorre.
SELECT * FROM pedidos WHERE cliente_id = (SELECT id FROM clientes WHERE cidade = 'São Paulo');
Solução - Use IN se várias linhas forem esperadas
SELECT * FROM pedidos WHERE cliente_id IN (SELECT id FROM clientes WHERE cidade = 'São Paulo');
Ou restrinja a subquery para retornar apenas uma linha
SELECT * FROM pedidos WHERE cliente_id =
(SELECT id FROM clientes WHERE cidade = 'São Paulo' AND ROWNUM = 1);
Conclusão
Sempre garanta que sua subquery retorne apenas um único valor quando necessário. Se houver múltiplos valores:
Use agregações (MIN(), MAX(), AVG())
Utilize IN em vez de =
Limite os resultados (ROWNUM = 1 ou FETCH FIRST 1 ROW ONLY)
Reescreva a consulta com JOIN
Subquery returned more than 1 value
Esse erro ocorre porque uma subquery (subconsulta) está retornando mais de um valor, mas a consulta principal espera apenas um único valor.
Exemplos de causas comuns:
1. Subquery usada com = ao invés de IN
Se sua subquery retorna múltiplos valores, mas está sendo usada com = (que espera um único valor), ocorre o erro.
Erro - Se houver mais de um cliente em São Paulo, a subquery falha.
SELECT * FROM pedidos WHERE cliente_id =
(SELECT cliente_id FROM clientes WHERE cidade = 'São Paulo');
Solução (Usar IN em vez de =)
SELECT * FROM pedidos WHERE cliente_id IN
(SELECT cliente_id FROM clientes WHERE cidade = 'São Paulo');
2 . Subquery usada em um SELECT escalar
Se a subquery retorna vários valores dentro de um SELECT, ocorre erro.
Erro - Se um cliente tiver mais de uma cidade, a subquery falha.
SELECT nome,
(SELECT cidade FROM clientes WHERE clientes.id = pedidos.cliente_id) AS cidade_cliente
FROM pedidos;
Solução1 (Limitar a subquery a um único valor)SELECT nome,
(SELECT cidade FROM clientes WHERE clientes.id = pedidos.cliente_id LIMIT 1) AS cidade_cliente
FROM pedidos;
Solução2 (Usar JOIN em vez de subquery)SELECT pedidos.nome, clientes.cidade
FROM pedidos
JOIN clientes ON pedidos.cliente_id = clientes.id;
Solução3. Subquery sem agregação retornando múltiplos valores
Se a subquery deveria retornar um único valor mas não está agregando os dados corretamente, ela pode falhar.
Erro - Se houver vários produtos na categoria "Eletrônicos", a subquery falha.
SELECT (SELECT preco FROM produtos WHERE categoria = 'Eletrônicos') AS preco;
.
Solução1 (Usar função de agregação)
SELECT (SELECT MAX(preco) FROM produtos WHERE categoria = 'Eletrônicos') AS preco_mais_alto;
ou
SELECT (SELECT AVG(preco) FROM produtos WHERE categoria = 'Eletrônicos') AS preco_medio;
Solução2 Subquery mal estruturada
Às vezes, a estrutura da subquery está errada e precisa ser reformulada.
Erro - Se um produto_id estiver em múltiplas categorias, a subquery falha.
SELECT nome,
(SELECT categoria FROM produtos WHERE produtos.id = pedidos.produto_id) AS categoria_produto
FROM pedidos;
Solução - (Usar JOIN)
SELECT pedidos.nome, produtos.categoria
FROM pedidos
JOIN produtos ON pedidos.produto_id = produtos.id;
Conclusão
✔ Use IN em vez de = quando a subquery retornar múltiplos valores.
✔ Use LIMIT 1 se precisar apenas de um resultado.
✔ Use funções agregadoras (MAX(), MIN(), SUM(), etc.) para reduzir os valores retornados.
✔ Substitua subqueries por JOIN sempre que possível para melhorar desempenho.
0 Comentários