 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
bladexp Novato

Registrado: Quarta-Feira, 30 de Agosto de 2017 Mensagens: 3
|
Enviada: Qua Ago 14, 2019 8:33 am Assunto: Fazer union entre duas tabelas |
|
|
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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Ago 15, 2019 12:15 pm Assunto: |
|
|
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 |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|