Inquiridor
O q tem de errado nesta consulta???

Pergunta
-
Olá pessoal,
Estou com a consulta abaixo e ela está me retornando o seguinte erro:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Como posso resolver isso?
Grato,
Ilano.
SELECT INSCRICAO, Cand_Nome, Cur_Nome, NASCIMENTO, IDADE, Cand_Turno, Res_Sala, NS_Codigo, SALA,
Res_Fase, PORT, MAT, CG, Usu_Codigo, (PORT + MAT + CG) AS SOMA,
RESULTADO =
CASE WHEN PORT > 0 AND MAT > 0 AND CG > 0 THEN 'APROVADO'
WHEN PORT = 0 OR MAT = 0 OR CG = 0 THEN 'REPROVADO'
ELSE 'REPROVADO' END
FROM (
SELECT DISTINCT A.Cand_Codigo, B.Cand_Nome, B.Cand_Turno, A.Ud_Codigo, A.Cur_Codigo, C.Cur_Nome,
A.Res_Fase, A.Usu_Codigo, A.Res_Sala, A.NS_Codigo,
'SALA ' + CONVERT(VarChar(10), A.Res_Sala) AS SALA,
G.Mat_Escore, CONVERT(VarChar(10), B.Cand_Nascimento,103) AS NASCIMENTO,
DATEDIFF(yyyy, B.Cand_Nascimento, GETDATE()) AS IDADE, CAST(RIGHT((E.PV_Ano * 0.0000000001), 2) AS Varchar(2)) +
'.' + CAST(RIGHT((A.Cur_Codigo * 0.0000000001), 2) AS Varchar(2)) + '.' +
CAST(RIGHT((A.Ud_Codigo * 0.0000000001), 2) AS Varchar(2)) + '.' +
CAST(RIGHT((A.Cand_Codigo * 0.0000000001), 4) AS Varchar(10)) AS INSCRICAO,
isnull((Select Res_Pontos From VESTIBULAR.V_Resultados
Where Mat_Codigo = 1 AND Cand_Codigo = A.Cand_Codigo), 1) AS PORT,
isnull((Select Res_Pontos From VESTIBULAR.V_Resultados
Where Mat_Codigo = 2 AND Cand_Codigo = A.Cand_Codigo), 1) AS MAT,
isnull((Select Res_Pontos From VESTIBULAR.V_Resultados
Where Mat_Codigo = 3 AND Cand_Codigo = A.Cand_Codigo), 1) AS CG
FROM VESTIBULAR.V_Resultados A
INNER JOIN VESTIBULAR.V_Candidatos B ON (A.Cand_Codigo = B.Cand_Codigo)
INNER JOIN CURSOS.C_Cursos C ON (A.Cur_Codigo = C.Cur_Codigo)
INNER JOIN VESTIBULAR.V_Vagas D ON (B.Vaga_Codigo = D.Vaga_Codigo)
INNER JOIN VESTIBULAR.V_PeriodoVestibular E ON (D.PV_Codigo = E.PV_Codigo)
INNER JOIN VESTIBULAR.V_Materias G ON (A.Mat_Codigo = G.Mat_Codigo)
) ABC
WHERE PORT IS NOT NULL AND Usu_Codigo = 1
ORDER BY Ud_Codigo, Cand_Turno, Res_Sala, SALA, Cur_Codigo, SOMA Desc, PORT Desc, MAT Desc, NASCIMENTO Desc- Movido Gustavo Maia Aguiar domingo, 23 de agosto de 2009 02:56 (De:SQL Server - Desenvolvimento Geral)
Todas as Respostas
-
Provavelmente esses subquerys estão retornando mais de um registro. Para este tipo de comparação, no seu caso, só pode ter um registro de um único campo.
isnull((Select Res_Pontos From VESTIBULAR.V_Resultados
Where Mat_Codigo = 1 AND Cand_Codigo = A.Cand_Codigo), 1) AS PORT,isnull((Select Res_Pontos From VESTIBULAR.V_Resultados
Where Mat_Codigo = 2 AND Cand_Codigo = A.Cand_Codigo), 1) AS MAT,isnull((Select Res_Pontos From VESTIBULAR.V_Resultados
Where Mat_Codigo = 3 AND Cand_Codigo = A.Cand_Codigo), 1) AS CG
Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil -
Ilanocf,
Isso mesmo, se analisarmos a mensagem de erro o SQL Server esta informando que suas subquerys estão retornando mais de uma linha e isso não é permitido quando utilizamos subquerys.
Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA -
Olá pessoal,
Desde já agradeço a atenção de todos.
Bom, alterei o script incluindo a linha em negrito. O problema é q existem momentos em q retorna tudo direitinho, mas ocorrem outros em que não retorna, ocorrendo o mesmo erro q o descrito no post anterior. Existe alguma forma de melhorar esta consulta? Pq isso está acontecendo?
Sql.Append(" FROM VESTIBULAR.V_Resultados A ")
Sql.Append(" INNER JOIN VESTIBULAR.V_Candidatos B ON (A.Cand_Codigo = B.Cand_Codigo) ")
Sql.Append(" INNER JOIN CURSOS.C_Cursos C ON (A.Cur_Codigo = C.Cur_Codigo) ")
Sql.Append(" INNER JOIN VESTIBULAR.V_Vagas D ON (B.Vaga_Codigo = D.Vaga_Codigo) ")
Sql.Append(" INNER JOIN VESTIBULAR.V_PeriodoVestibular E ON (D.PV_Codigo = E.PV_Codigo) ")
Sql.Append(" INNER JOIN VESTIBULAR.V_MateriasCursos F ON (A.Mat_Codigo = F.Mat_Codigo) ")
Sql.Append(" INNER JOIN VESTIBULAR.V_Materias G ON (A.Mat_Codigo = G.Mat_Codigo) ")
Grato,
Ilano. -
Ilano,
Você conseguiu solucionar o seu problema?
Caso afirmativo poste a solução para que outras pessoas se beneficiem.Att,
Fernanda
“Caso esta resposta tenha ajudado a solucionar sua dúvida, favor clicar em “Marcar como Resposta” para beneficiar outros membros da comunidade que estejam lendo este thread”.