SQL - UNION

SQL Server

SQL

13/03/2019

Tenho a seguinte consulta
SELECT SATIVIDADEALUNO.CODCOLIGADA,
       SATIVIDADEALUNO.IDATIVIDADE,
       SATIVIDADEALUNO.IDOFERTA,
       SATIVIDADE.DESCRICAO,
       CONVERT(VARCHAR(MAX), SATIVIDADEALUNO.RA) CODPARTICIPANTE,
       PPESSOA.NOME                              NOMEPARTICIPANTE,
       'A'                                       TIPOPARTICIPANTE,
       'Aluno'                                   TIPOPARTICIPANTEDESCRICAO,
       SALUNO.CODPESSOA
FROM   SALUNO (NOLOCK)
       INNER JOIN SHABILITACAOALUNO (NOLOCK)
         ON SHABILITACAOALUNO.RA = SALUNO.RA
            AND SHABILITACAOALUNO.CODCOLIGADA = SALUNO.CODCOLIGADA
       INNER JOIN SATIVIDADEALUNO (NOLOCK)
         ON SATIVIDADEALUNO.IDHABILITACAOFILIAL = SHABILITACAOALUNO.IDHABILITACAOFILIAL
            AND SATIVIDADEALUNO.RA = SHABILITACAOALUNO.RA
            AND SATIVIDADEALUNO.CODCOLIGADA = SHABILITACAOALUNO.CODCOLIGADA
       INNER JOIN PPESSOA (NOLOCK)
         ON PPESSOA.CODIGO = SALUNO.CODPESSOA
       INNER JOIN SATIVIDADE (NOLOCK)
         ON SATIVIDADE.CODCOLIGADA = SATIVIDADEALUNO.CODCOLIGADA
            AND SATIVIDADE.IDOFERTA = SATIVIDADEALUNO.IDOFERTA
WHERE  CUMPRIUATIVIDADE = 'N'
       AND SATIVIDADEALUNO.IDPERLET = @P
       AND SATIVIDADEALUNO.IDOFERTA = :IDOFERTA
UNION
SELECT SATIVIDADEPROFESSOR.CODCOLIGADA,
       SATIVIDADEPROFESSOR.IDATIVIDADEPROF,
       SATIVIDADEPROFESSOR.IDOFERTA,
       SATIVIDADE.DESCRICAO,
       CONVERT(VARCHAR(MAX), SATIVIDADEPROFESSOR.CODPROF) CODPARTICIPANTE,
       PPESSOA.NOME                                       NOMEPARTICIPANTE,
       'P'                                                TIPOPARTICIPANTE,
       'Professor'                                        TIPOPARTICIPANTEDESCRICAO,
       SPROFESSOR.CODPESSOA
FROM   SATIVIDADEPROFESSOR
       INNER JOIN SATIVIDADE (NOLOCK)
         ON SATIVIDADE.CODCOLIGADA = SATIVIDADEPROFESSOR.CODCOLIGADA
            AND SATIVIDADE.IDOFERTA = SATIVIDADEPROFESSOR.IDOFERTA
       INNER JOIN SPROFESSOR (NOLOCK)
         ON SPROFESSOR.CODPROF = SATIVIDADEPROFESSOR.CODPROF
            AND SPROFESSOR.CODCOLIGADA = SATIVIDADEPROFESSOR.CODCOLIGADA
       INNER JOIN PPESSOA (NOLOCK)
         ON PPESSOA.CODIGO = SPROFESSOR.CODPESSOA
WHERE  CUMPRIUATIVIDADE = 'N'
       AND DTINICIO >= @DTI
       AND DTTERMINO <= @DTF
       AND SATIVIDADEPROFESSOR.IDOFERTA = :IDOFERTA

Antes de colocar o campo como varchar o retorno do union colocava o Código do participante como inteiro, isto sem ter sido definido. Nas tabelas onde o campo é buscado apenas o código da pessoa é inteiro todo o restante é Varchar (vide função SP_HELP).
Gostaria de entender o por que disto. Alguém sabe dizer?
Chromusmaster

Chromusmaster

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

14/03/2019

talvez ele se baseie no tipo de campo da última tabela utilizada.
GOSTEI 1

Mais Respostas

Emerson Nascimento

Emerson Nascimento

13/03/2019

Você obtém o resultado de CODPARTICIPANTE de campos de duas tabelas distintas: SATIVIDADEALUNO.RA e SATIVIDADEPROFESSOR.CODPROF.

Acredito que um desses campos deve estar definido como inteiro.

GOSTEI 0
Chromusmaster

Chromusmaster

13/03/2019

Você obtém o resultado de CODPARTICIPANTE de campos de duas tabelas distintas: SATIVIDADEALUNO.RA e SATIVIDADEPROFESSOR.CODPROF.

Acredito que um desses campos deve estar definido como inteiro.

Na verdade são de três tabela, a consulta anterior é apenas um trecho dela. Na terceira tabela o codigo do participante é definido como inteiro. Nestes casos, o Union vai se basear na diferença entre os campos? Deveria ter pedo varchar, já que dois campo são varchar, não?
GOSTEI 0
POSTAR