ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Fazer union entre duas tabelas

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
bladexp
Novato
Novato


Registrado: Quarta-Feira, 30 de Agosto de 2017
Mensagens: 3

MensagemEnviada: Qua Ago 14, 2019 8:33 am    Assunto: Fazer union entre duas tabelas Responder com Citação

Bom dia!

Preciso fazer um union com duas tabelas, mas sem repetir, só que as quatro primeiras colunas se repetem e as demais não, o que faz com que o distinct não funcione. Alguém conhece alguma alternativa. Abaixo segue o select

Código:
SELECT SERV.EQUIPAMENTO, SERV.DESCRICAO, SERV.SERVICO,SERV.DESCSERVICO, SERV.SIGLA, SERV.MARCADOR, SERV.DIFERENCA FROM(
SELECT SERVICOEQPTO.EQUIPAMENTO, EQUIPAMENTO.DESCRICAO, SERVICOEQPTO.SERVICO, SERVICO.DESCRICAO DESCSERVICO, UNIDADEMEDIDA.SIGLA, SERVICOEQPTO.MARCADOR,
       CAST(EQPTOCOMPONENTE.MARCADOR as Numeric(18,2)) / CAST(SERVICOEQPTO.MARCADOR as Numeric(18,2)) *100 DIFERENCA
       ,'S1' FLG_SN
  FROM SERVICOEQPTO, EQUIPAMENTO, UNIDADEMEDIDA, SERVICO, SERVICOCOMPONENTE, EQPTOCOMPONENTE                                                           
 WHERE SERVICOEQPTO.EQUIPAMENTO    = EQUIPAMENTO.CODIGO                                                                                                 
   AND SERVICOEQPTO.UNIDADEMEDIDA  = UNIDADEMEDIDA.CODIGO                                                                                               
   AND SERVICOEQPTO.SERVICO        = SERVICO.CODIGO                                                                                                     
   AND SERVICOCOMPONENTE.SERVICO   = SERVICO.CODIGO                                                                                                     
   AND EQPTOCOMPONENTE.EQUIPAMENTO = EQUIPAMENTO.CODIGO                                                                                                 
   AND EQPTOCOMPONENTE.COMPONENTE  = SERVICOCOMPONENTE.COMPONENTE                                                                                       
   AND EQPTOCOMPONENTE.DTFINAL     IS NULL                                                                                                             
   AND SERVICO.ATIVO               = 'S'
   and exists(SELECT X.CODIGO, X.DESCRICAO, SERVICOPREVCLASSE.SERVICO, SERVICO.DESCRICAO DESCSERVICO, UNIDADEMEDIDA.SIGLA, SERVICOPREVCLASSE.MARCADOR,
          CAST(EQPTOCOMPONENTE.MARCADOR as Numeric(18,2)) / CAST(SERVICOPREVCLASSE.MARCADOR as Numeric(18,2)) *100 DIFERENCA
       ,'S2' FLG_SN
     FROM SERVICOPREVCLASSE, EQUIPAMENTO X, UNIDADEMEDIDA, SERVICO, SERVICOCOMPONENTE, EQPTOCOMPONENTE
    WHERE SERVICOPREVCLASSE.CLASSEEQUIPAMENTO    = X.CLASSEEQUIPAMENTO
      AND SERVICOPREVCLASSE.UNIDADEMEDIDA  = UNIDADEMEDIDA.CODIGO
      AND SERVICOPREVCLASSE.SERVICO        = SERVICO.CODIGO
      AND SERVICOCOMPONENTE.SERVICO   = SERVICO.CODIGO                                                                                                     
      AND EQPTOCOMPONENTE.EQUIPAMENTO = X.CODIGO
      AND EQPTOCOMPONENTE.COMPONENTE  = SERVICOCOMPONENTE.COMPONENTE                                                                                       
      AND EQPTOCOMPONENTE.DTFINAL     IS NULL                                                                                                             
      AND SERVICO.ATIVO               = 'S'
      AND X.CODIGO = EQUIPAMENTO.CODIGO)
   GROUP BY SERVICOEQPTO.EQUIPAMENTO, EQUIPAMENTO.DESCRICAO, SERVICOEQPTO.SERVICO, SERVICO.DESCRICAO , UNIDADEMEDIDA.SIGLA, SERVICOEQPTO.MARCADOR,DIFERENCA
UNION
SELECT EQUIPAMENTO.CODIGO, EQUIPAMENTO.DESCRICAO, SERVICOPREVCLASSE.SERVICO, SERVICO.DESCRICAO DESCSERVICO, UNIDADEMEDIDA.SIGLA, SERVICOPREVCLASSE.MARCADOR,
          CAST(EQPTOCOMPONENTE.MARCADOR as Numeric(18,2)) / CAST(SERVICOPREVCLASSE.MARCADOR as Numeric(18,2)) *100 DIFERENCA
       ,'S2' FLG_SN
     FROM SERVICOPREVCLASSE, EQUIPAMENTO, UNIDADEMEDIDA, SERVICO, SERVICOCOMPONENTE, EQPTOCOMPONENTE
    WHERE SERVICOPREVCLASSE.CLASSEEQUIPAMENTO    = EQUIPAMENTO.CLASSEEQUIPAMENTO
      AND SERVICOPREVCLASSE.UNIDADEMEDIDA  = UNIDADEMEDIDA.CODIGO
      AND SERVICOPREVCLASSE.SERVICO        = SERVICO.CODIGO
      AND SERVICOCOMPONENTE.SERVICO   = SERVICO.CODIGO                                                                                                     
      AND EQPTOCOMPONENTE.EQUIPAMENTO = EQUIPAMENTO.CODIGO                                                                                                 
      AND EQPTOCOMPONENTE.COMPONENTE  = SERVICOCOMPONENTE.COMPONENTE                                                                                       
      AND EQPTOCOMPONENTE.DTFINAL     IS NULL                                                                                                             
      AND SERVICO.ATIVO               = 'S'
   GROUP BY  EQUIPAMENTO.CODIGO, EQUIPAMENTO.DESCRICAO, SERVICOPREVCLASSE.SERVICO, SERVICO.DESCRICAO , UNIDADEMEDIDA.SIGLA, SERVICOPREVCLASSE.MARCADOR, DIFERENCA) SERV
   GROUP BY SERV.EQUIPAMENTO, SERV.DESCRICAO, SERV.SERVICO,SERV.DESCSERVICO, SERV.SIGLA, SERV.MARCADOR, SERV.DIFERENCA
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Ago 15, 2019 12:15 pm    Assunto: Responder com Citação

Bom dia,

Não sei qual banco de dados (e versão) você está utilizando e se entendi corretamente a sua query e o que você quer mas experimente fazer uns testes utilizando Full Join em vez de Union:

Código:
SELECT
    CASE WHEN S1.EQUIPAMENTO IS NULL THEN S2.EQUIPAMENTO ELSE S1.EQUIPAMENTO END EQUIPAMENTO,
    CASE WHEN S1.EQUIPAMENTO IS NULL THEN S2.DESCRICAO ELSE S1.DESCRICAO END DESCRICAO,
    CASE WHEN S1.EQUIPAMENTO IS NULL THEN S2.SERVICO ELSE S1.SERVICO END SERVICO,
    CASE WHEN S1.EQUIPAMENTO IS NULL THEN S2.DESCSERVICO ELSE S1.DESCSERVICO END DESCSERVICO,
    CASE WHEN S1.EQUIPAMENTO IS NULL THEN S2.SIGLA ELSE S1.SIGLA END SIGLA,
    CASE WHEN S1.EQUIPAMENTO IS NULL THEN S2.MARCADOR ELSE S1.MARCADOR END MARCADOR,
    CASE WHEN S1.EQUIPAMENTO IS NULL THEN S2.DIFERENCA ELSE S1.DIFERENCA END DIFERENCA
FROM
(
    SELECT
        SERVICOEQPTO.EQUIPAMENTO,
        EQUIPAMENTO.DESCRICAO,
        SERVICOEQPTO.SERVICO,
        SERVICO.DESCRICAO DESCSERVICO,
        UNIDADEMEDIDA.SIGLA,
        SERVICOEQPTO.MARCADOR,
        CAST(EQPTOCOMPONENTE.MARCADOR as Numeric(18,2)) / CAST(SERVICOEQPTO.MARCADOR as Numeric(18,2)) * 100 DIFERENCA,
        'S1' FLG_SN
    FROM SERVICOEQPTO
    INNER JOIN EQUIPAMENTO
        ON EQUIPAMENTO.CODIGO = SERVICOEQPTO.EQUIPAMENTO
    INNER JOIN UNIDADEMEDIDA
        ON UNIDADEMEDIDA.CODIGO = SERVICOEQPTO.UNIDADEMEDIDA

    INNER JOIN SERVICO
        ON SERVICO.CODIGO = SERVICOEQPTO.SERVICO
    INNER JOIN SERVICOCOMPONENTE
        ON SERVICOCOMPONENTE.SERVICO = SERVICOEQPTO.SERVICO
    INNER JOIN EQPTOCOMPONENTE
        ON EQPTOCOMPONENTE.EQUIPAMENTO = EQUIPAMENTO.CODIGO AND
           EQPTOCOMPONENTE.COMPONENTE = SERVICOCOMPONENTE.COMPONENTE
    WHERE
        EQPTOCOMPONENTE.DTFINAL IS NULL AND
        SERVICO.ATIVO = 'S'
) S1
FULL JOIN
(
    SELECT
        EQUIPAMENTO.CODIGO EQUIPAMENTO,
        EQUIPAMENTO.DESCRICAO,
        SERVICOPREVCLASSE.SERVICO,
        SERVICO.DESCRICAO DESCSERVICO,
        UNIDADEMEDIDA.SIGLA,
        SERVICOPREVCLASSE.MARCADOR,
        CAST(EQPTOCOMPONENTE.MARCADOR as Numeric(18,2)) / CAST(SERVICOPREVCLASSE.MARCADOR as Numeric(18,2)) * 100 DIFERENCA,
        'S2' FLG_SN
    FROM SERVICOPREVCLASSE
    INNER JOIN EQUIPAMENTO
        ON EQUIPAMENTO.CLASSEEQUIPAMENTO = SERVICOPREVCLASSE.CLASSEEQUIPAMENTO
    INNER JOIN UNIDADEMEDIDA
        ON UNIDADEMEDIDA.CODIGO = SERVICOPREVCLASSE.UNIDADEMEDIDA
    INNER JOIN SERVICO
        ON SERVICO.CODIGO = SERVICOPREVCLASSE.SERVICO
    INNER JOIN SERVICOCOMPONENTE
        ON SERVICOCOMPONENTE.SERVICO = SERVICO.CODIGO
    INNER JOIN EQPTOCOMPONENTE
        ON EQPTOCOMPONENTE.EQUIPAMENTO = EQUIPAMENTO.CODIGO AND
           EQPTOCOMPONENTE.COMPONENTE  = SERVICOCOMPONENTE.COMPONENTE
    WHERE
        EQPTOCOMPONENTE.DTFINAL IS NULL AND
        SERVICO.ATIVO = 'S'
) S2
    on S2.EQUIPAMENTO = S1.EQUIPAMENTO
WHERE
    S2.EQUIPAMENTO IS NOT NULL


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB