none
O q tem de errado nesta consulta??? RRS feed

  • 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)
    quarta-feira, 12 de agosto de 2009 11:40

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
    quarta-feira, 12 de agosto de 2009 11:45
  • 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
    quarta-feira, 12 de agosto de 2009 14:31
  • 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.
    quinta-feira, 13 de agosto de 2009 11:24
  • 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”.
    sexta-feira, 21 de agosto de 2009 14:57