Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Naldo Carvalho

Cláusula UNION

Recommended Posts

Olá pessoal, estou precisando de uma ajuda e/ou opinião:

 

Tenho o seguinte cenário:

 

  • 3 tabelas: tabCliente, tabEmpresa, tabPagamentos
  • Na tabela de pagamentos existem os campos idcliente e o tipopessoa, onde pode ser 'PF' ou 'PJ'
  • Os pagamentos podem ser feitos via cliente e/ou empresa
Na hora de gerar o relatório atualmente usa a seguinte SQL:

 

SELECT a.idpagamento, a.idcliente, a.tipopessoa, c.nome, e.nomefantasia, a.datapagamento
FROM tabPagamentos a
LEFT OUTER JOIN tabEmpresa e ON (a.idcliente = e.idempresa AND a.tipopessoa='PJ')
LEFT OUTER JOIN tabCliente c ON (a.idcliente = c.idcliente AND a.tipopessoa='PF')
WHERE a.pago=1
ORDER BY a.datapagamento DESC

O resultado gerado:

 

idpag	idcli	tipo	nome	        nomefantasia    datapag 	
14700	100	PF	JOAO	        	        2009-10-15
12231	1254	PJ			CLINICA A       2009-10-14
12369	1267	PF	MARIA	        	        2009-10-14
9785	1031	PF	ANTONIO	        	        2009-10-10
12267	1259	PJ			CLINICA B       2009-10-10

Para montar o relatorio para impressão uso uma função para puxar o nome que estiver preenchido seja o do cliente ou da empresa.

 

idpag	idcli	nome	        datapag 	
14700	100	JOAO	        2009-10-15
12231	1254	CLINICA A       2009-10-14
12369	1267	MARIA	        2009-10-14
9785	1031	ANTONIO	        2009-10-10
12267	1259	CLINICA B       2009-10-10

Então resolvir usar a cláusula UNION para otimizar as coisas e ficou assim:

 

SELECT a.idpagamento, a.idcliente, c.nome, a.datapagamento
FROM tabPagamentos a, tabCliente c WHERE (a.idcliente=c.idcliente AND a.tipopessoa='PF') AND (a.pago=1)
UNION
SELECT a.idpagamento, a.idcliente, e.nomefantasia, a.datapagamento
FROM tabPagamentos a, tabEmpresa e WHERE (a.idcliente=e.idempresa AND a.tipopessoa='PJ') AND (a.pago=1)
ORDER BY a.datapagamento DESC

O resultado gerado:

 

idpag	idcli	nome	        datapag 	
14700	100	JOAO	        2009-10-15
12231	1254	CLINICA A       2009-10-14
12369	1267	MARIA	        2009-10-14
9785	1031	ANTONIO	        2009-10-10
12267	1259	CLINICA B       2009-10-10

Sendo assim a query ja sai organizada sem que eu tenha que usar funções externas para deixar tudo organizado, uma beleza. Só que nesse caso não estou conseguindo fazer uma pesquisa em campos que são diferentes nas 2 tabelas, coisa que na SQL original posso fazer tranquilamente, ex:

 

SELECT a.idpagamento, a.idcliente, c.nome, a.datapagamento
FROM tabPagamentos a, tabCliente c WHERE (a.idcliente=c.idcliente AND a.tipopessoa='PF') AND (a.pago=1) AND (c.cpf LIKE '%74591%')
UNION
SELECT a.idpagamento, a.idcliente, e.nomefantasia, a.datapagamento
FROM tabPagamentos a, tabEmpresa e WHERE (a.idcliente=e.idempresa AND a.tipopessoa='PJ') AND (a.pago=1)
ORDER BY a.datapagamento DESC

A questão é que no resultado a primeira tabela é filtrada e a segunda não, trazendo então todas as empresas. Não posso pesquisar o valor passado no campo do CNPJ das empresas o que seria o certo a fazer pelo fato de usar UNION.

 

A Solução acredito seria fazer o WHERE após a UNION e usar o campo desejado CPF ou CNPJ mas não funciona ou não estou sabendo fazer.

 

Alguma sugestão?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para UNION teria de filtrar nos dois blocos de SQL, pois são SQLs separados, sendo assim preciso o filtro.

Outra coisa que poderia fazer é uma VIEW no caso a VIEW teria a estrutura principal do SQL, e depois você somente filtraria uma vez sobre estes registros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.