none
Union - Sql 2008 RRS feed

  • Pergunta

  • bom dia a todos, prezados vejam que estranho, ou erro eu mesmo,


    SELECT F.CODFUNCAO,
    '0'

     FROM PFUNC AS P
    INNER JOIN PFHSTFCO      AS F  (NOLOCK)ON F.CODCOLIGADA  = P.CODCOLIGADA AND F.CHAPA   = P.CHAPA
    INNER JOIN PFUNCAO       AS P1 (NOLOCK)ON P1.CODCOLIGADA = F.CODCOLIGADA AND P1.CODIGO = F.CODFUNCAO
    WHERE P.CHAPA  =  '010684'
    AND F.MOTIVO = '02'
    UNION

    SELECT '0',
    F.CODFUNCAO

     FROM PFUNC AS P
    INNER JOIN PFHSTFCO      AS F  (NOLOCK)ON F.CODCOLIGADA  = P.CODCOLIGADA AND F.CHAPA   = P.CHAPA
    INNER JOIN PFUNCAO       AS P1 (NOLOCK)ON P1.CODCOLIGADA = F.CODCOLIGADA AND P1.CODIGO = F.CODFUNCAO
    WHERE P.CHAPA  =  '010684'
    AND F.MOTIVO <> '02'

    Resultado

    0             000119
    000339    0

    para inicio esta correto, porem quanto eu faço conforme abaixo colocando data ele me retorna mensagem de erro, vejam


    SELECT F.CODFUNCAO,
    '0',
    F.DTMUDANÇA,
    '0'

     FROM PFUNC AS P
    INNER JOIN PFHSTFCO      AS F  (NOLOCK)ON F.CODCOLIGADA  = P.CODCOLIGADA AND F.CHAPA   = P.CHAPA
    INNER JOIN PFUNCAO       AS P1 (NOLOCK)ON P1.CODCOLIGADA = F.CODCOLIGADA AND P1.CODIGO = F.CODFUNCAO
    WHERE P.CHAPA  =  '010684'
    AND F.MOTIVO = '02'
    UNION

    SELECT '0',
    F.CODFUNCAO,
    '0',
    F.DTMUDANCA

     FROM PFUNC AS P
    INNER JOIN PFHSTFCO      AS F  (NOLOCK)ON F.CODCOLIGADA  = P.CODCOLIGADA AND F.CHAPA   = P.CHAPA
    INNER JOIN PFUNCAO       AS P1 (NOLOCK)ON P1.CODCOLIGADA = F.CODCOLIGADA AND P1.CODIGO = F.CODFUNCAO
    WHERE P.CHAPA  =  '010684'
    AND F.MOTIVO <> '02'

    Mensagem de erro.

    Msg 241, Level 16, State 1, Line 2

    Conversion failed when converting datetime from character string.

    prezados no 2005 eu conseguia fazer isso, muito estranho, obrigado pela ajuda

    quarta-feira, 4 de abril de 2012 13:19

Respostas

  • Ronnie,

    Vou tentar explicar melhor o que falei antes...
    O UNION faz a junção de duas ou mais tabelas, obedecendo as seguintes regras:

    - Os SELECTS ligados pelo UNION devem retornar a mesma quantidade de colunas;

    - As colunas com a mesma posição no SELECT devem possuir o mesmo tipo de dados.

    No seu primeiro SELECT, na terceira coluna você exibe um campo DATA e no segundo SELECT, na terceira coluna também (ou seja, na mesma posição da segunda) você tentou exibir um campo STRING. Daí veio o erro...

    Quando você coloca o NULL como fez acima, não há conflitos de tipos de campos (já que NULL não é um tipo) e por isso funcionou.


    Na imagem abaixo destaquei em vermelho e verde onde está seu problema.

    Espero ter ajudado =)


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    • Marcado como Resposta Ronnie Von quinta-feira, 5 de abril de 2012 14:53
    quarta-feira, 4 de abril de 2012 21:43
  • Ronnie,

    Os tipos dos campos das duas tabelas devem ser do mesmo tipo.
    Se você olhar seus selects, vai ver que está tentando unir DATETIME com VARCHAR (3º campo do SELECT) e VARCHAR com DATETIME (4º  campo do SELECT)

    1º SELECT
    F.CODFUNCAO, '0', F.DTMUDANÇA, '0'

    2º SELECT

    '0', F.CODFUNCAO, '0', F.DTMUDANCA


    Espero ter ajudado.


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    • Sugerido como Resposta Eduardo Gomes Pereira quarta-feira, 4 de abril de 2012 17:44
    • Marcado como Resposta Ronnie Von quinta-feira, 5 de abril de 2012 14:54
    quarta-feira, 4 de abril de 2012 16:27

Todas as Respostas

  • Ronnie,

    Os tipos dos campos das duas tabelas devem ser do mesmo tipo.
    Se você olhar seus selects, vai ver que está tentando unir DATETIME com VARCHAR (3º campo do SELECT) e VARCHAR com DATETIME (4º  campo do SELECT)

    1º SELECT
    F.CODFUNCAO, '0', F.DTMUDANÇA, '0'

    2º SELECT

    '0', F.CODFUNCAO, '0', F.DTMUDANCA


    Espero ter ajudado.


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    • Sugerido como Resposta Eduardo Gomes Pereira quarta-feira, 4 de abril de 2012 17:44
    • Marcado como Resposta Ronnie Von quinta-feira, 5 de abril de 2012 14:54
    quarta-feira, 4 de abril de 2012 16:27
  • Mariana desculpa a minha ignorancia, mas nao entendi muito bem, veja essa exe, estou tratando da mesma forma e funciona.


    SELECT F.CODFUNCAO,
    '0'

     FROM PFUNC AS P
    INNER JOIN PFHSTFCO      AS F  (NOLOCK)ON F.CODCOLIGADA  = P.CODCOLIGADA AND F.CHAPA   = P.CHAPA
    INNER JOIN PFUNCAO       AS P1 (NOLOCK)ON P1.CODCOLIGADA = F.CODCOLIGADA AND P1.CODIGO = F.CODFUNCAO
    WHERE P.CHAPA  =  '010684'
    AND F.MOTIVO = '02'
    UNION

    SELECT '0',
    F.CODFUNCAO

     FROM PFUNC AS P
    INNER JOIN PFHSTFCO      AS F  (NOLOCK)ON F.CODCOLIGADA  = P.CODCOLIGADA AND F.CHAPA   = P.CHAPA
    INNER JOIN PFUNCAO       AS P1 (NOLOCK)ON P1.CODCOLIGADA = F.CODCOLIGADA AND P1.CODIGO = F.CODFUNCAO
    WHERE P.CHAPA  =  '010684'
    AND F.MOTIVO <> '02'

    quarta-feira, 4 de abril de 2012 18:01
  • Pessoa nao sei se foi a melhor forma de resolver mais consegui dessa forma, usando NULL, vejam


    SELECT F.CODFUNCAO,
    '0',
    DTMUDANCA,
    NULL


     FROM PFUNC AS P
    INNER JOIN PFHSTFCO      AS F  (NOLOCK)ON F.CODCOLIGADA  = P.CODCOLIGADA AND F.CHAPA   = P.CHAPA
    INNER JOIN PFUNCAO       AS P1 (NOLOCK)ON P1.CODCOLIGADA = F.CODCOLIGADA AND P1.CODIGO = F.CODFUNCAO
    WHERE P.CHAPA  =  '010684'
    AND F.MOTIVO = '02'
    UNION

    SELECT '0',
    F.CODFUNCAO,
    null,
    F.DTMUDANCA


     FROM PFUNC AS P
    INNER JOIN PFHSTFCO      AS F  (NOLOCK)ON F.CODCOLIGADA  = P.CODCOLIGADA AND F.CHAPA   = P.CHAPA
    INNER JOIN PFUNCAO       AS P1 (NOLOCK)ON P1.CODCOLIGADA = F.CODCOLIGADA AND P1.CODIGO = F.CODFUNCAO
    WHERE P.CHAPA  =  '010684'
    AND F.MOTIVO <> '02'

    quarta-feira, 4 de abril de 2012 18:04
  • Ronnie,

    Vou tentar explicar melhor o que falei antes...
    O UNION faz a junção de duas ou mais tabelas, obedecendo as seguintes regras:

    - Os SELECTS ligados pelo UNION devem retornar a mesma quantidade de colunas;

    - As colunas com a mesma posição no SELECT devem possuir o mesmo tipo de dados.

    No seu primeiro SELECT, na terceira coluna você exibe um campo DATA e no segundo SELECT, na terceira coluna também (ou seja, na mesma posição da segunda) você tentou exibir um campo STRING. Daí veio o erro...

    Quando você coloca o NULL como fez acima, não há conflitos de tipos de campos (já que NULL não é um tipo) e por isso funcionou.


    Na imagem abaixo destaquei em vermelho e verde onde está seu problema.

    Espero ter ajudado =)


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    • Marcado como Resposta Ronnie Von quinta-feira, 5 de abril de 2012 14:53
    quarta-feira, 4 de abril de 2012 21:43
  • Obrigado pelo otima explicação Mariana, valeu mesmo.
    quinta-feira, 5 de abril de 2012 14:54