Uso do Left Join com mais de uma tabela.

Delphi

26/09/2005

Seguinte . . . preciso mostras os contribuintes cujo codigo está distribuido em 3 tabelas de cálculos, ou seja, mostras os contribuintes que contenha calculo na tabela1, pode conter cálculo na Tabela2 e tbém pode conter cálculo na tabela3. To pensando em usar Left Join no entanto da Tabela de contribuintes com mais outras três tabelas que podem conter cálculos ou não. Alguém pode me ajudar?


Amilton/pr

Amilton/pr

Curtidas 0

Respostas

Rjun

Rjun

26/09/2005

Lista a estrutura das tabelas.


GOSTEI 0
Amilton/pr

Amilton/pr

26/09/2005

Obs. - Bases em Paradox

Contrib.db - Tabela de Contribuintes

NumInscric A 6
Nome A 40
Endereco A 40
Ativid N Chave strangeira
Obs. Principais campos

Ativ.db - Tabela de Atividades

CodAtiv N Chave primaria relac. com Ativ de Contrib
Atividade A 50 Descrição Atividade

CalcThe.db - Calculo Hor. Especial
NumeroInsc A 6
ValorThe N

CalcTll.db - Calculo de Alvara
NumeroInsc A 6
ValorTll N

CalcTsvs.db - Calculo Saude
NumeroInsc A 6
ValorTsvs N


Não sei se fui bem claro, mas o fato é que preciso mostrar os contribuintes que tenham ou não valor nas tabelas de CalcTll, CalcThe e CalcTsvs, cujos códigos de atividades seja iguais(Contrib.Db com Ativ.db).

Espero ajuda . . .


GOSTEI 0
Rjun

Rjun

26/09/2005

Acho que o select é esse, embora eu não tenha testado com [b:f720c2beb0]paradox[/b:f720c2beb0]. Apenas gostaria de fazer uma observação. Quando se estuda normalização, aprendemos que tabelas com a mesma chave primária, são a mesma tabela. Então, você tem 4 tabelas com a mesma chave primária. Pense nisso.

SELECT 
  Co.NumInscric,
  Co.Nome,
  Av.Atividade,
  Ct.ValorThe,
  Cl.ValorTll,
  Cs.ValorTsvs  
FROM
  Contrib Co
LEFT JOIN
  Ativ Av on Av.CodAtiv = Co.Ativid
LEFT JOIN
  CalcThe Ct on Ct.NumeroInsc = Co.NumInscric
LEFT JOIN
  CalcTll Cl on Cl.NumeroInsc = Co.NumInscric
LEFT JOIN
  CalcTsvs Cs on Cs.NumeroInsc = Co.NumInscric



GOSTEI 0
Amilton/pr

Amilton/pr

26/09/2005

Blz., somente uma questão . . . Os dados do contribuinte estão na tabela Contribuinte(Obviamente), então eu não deveria fazer o Left Join do contribuinte para as tabelas que possivelmente existiria cálculo ou não para que fosse mostrado a tabela da esquerda(Contrib.db) havendo assim o relacionamento com a outra tabela?
Obrigado pela atenção


GOSTEI 0
Rjun

Rjun

26/09/2005

[quote:43eb53e4bf=´Amilton/Pr´]Blz., somente uma questão . . . Os dados do contribuinte estão na tabela Contribuinte(Obviamente), então eu não deveria fazer o Left Join do contribuinte para as tabelas que possivelmente existiria cálculo ou não para que fosse mostrado a tabela da esquerda(Contrib.db) havendo assim o relacionamento com a outra tabela?[/quote:43eb53e4bf]

E não foi isso que eu fiz?


GOSTEI 0
Amilton/pr

Amilton/pr

26/09/2005

Veja bem . . .

LEFT JOIN
Ativ Av on Av.CodAtiv = Co.Ativid
LEFT JOIN
CalcThe Ct on Ct.NumeroInsc = Co.NumInscric
LEFT JOIN
CalcTll Cl on Cl.NumeroInsc = Co.NumInscric
LEFT JOIN
CalcTsvs Cs on Cs.NumeroInsc = Co.NumInscric

Eu entendo que tá mostrando a tabela da esquerda onde tem o calculo e não tem o nome e sim o valor do cálculo = a tabela de contribuintes onde está o nome. Não deveria ser ao contrário? mas pra ser ao contrário pode-se repetir a tabela de contribuintes várias vezes pra cada tabela?

SDS


GOSTEI 0
Rjun

Rjun

26/09/2005

Agora você ta me deixando confuso. A tabela da esquerda não é a de contribuintes?


GOSTEI 0
Amilton/pr

Amilton/pr

26/09/2005

Não. As tabelas CalcThe, CalcTsvs, CalcTll é que estão asrmazenados os valores calculados. A tabela Contrib.db é a tabela de Cadastrado de Contribuintes. A idéia é Mostrar os dados do contribuinte juntamente com o valor calculado nas tabelas de Calculos que são CalcThe, CalcTsvs e CalcTll.

SDS.


GOSTEI 0
Rjun

Rjun

26/09/2005

Mas não é isso que está sendo exibido?


GOSTEI 0
Amilton/pr

Amilton/pr

26/09/2005

Seguinte . . . Vou rodar essa Query no Projeto e respondo; Vc. sabe se posso fazer ao contrario, assim:

LEFT JOIN
Ativ Av on Av.CodAtiv = Co.Ativid
LEFT JOIN
Co.NumInscric = CalcThe Ct on Ct.NumeroInsc
LEFT JOIN
Co.NumInscric = CalcTll Cl on Cl.NumeroInsc
LEFT JOIN
Co.NumInscric = CalcTsvs Cs on Cs.NumeroInsc


GOSTEI 0
Rjun

Rjun

26/09/2005

Acho que não. A sintaxe é essa que utilizei.


GOSTEI 0
Martins

Martins

26/09/2005

Acho que não. A sintaxe é essa que utilizei.


Não rodei nada aqui, mas acredito q vc está certo [b:aab0ed2da2]Rjun[/b:aab0ed2da2], agora vamos esperar o nosso amigo postar aqui novamente para ver o q ele conseguiu.


GOSTEI 0
Andremuller

Andremuller

26/09/2005

o sql do rjun está correto,
porém fica outra dúvida.

o colega disse que quer os contribuintes ´que [b:f4dcb3d401]CONTENHA[/b:f4dcb3d401] calculo na tabela1, [b:f4dcb3d401]pode conter[/b:f4dcb3d401] cálculo na Tabela2 e tbém [b:f4dcb3d401]pode conter[/b:f4dcb3d401] cálculo na tabela3

pelo descrito eu entendi que no primeiro relacionamento deve ser um inner ao invés de um left.


GOSTEI 0
Amilton/pr

Amilton/pr

26/09/2005

Ta funcionando, mas agora tá repetindo o registro várias vezes dentro da Banda(To usando o QuickReport com Delphi6). Acho que falta algum Parámetro pra não repetir o registro tantas vezes. Alguém pode ajudar?


GOSTEI 0
Rjun

Rjun

26/09/2005

Está repetindo o mesmo registro? Coloque uma parte do relatório.


GOSTEI 0
Amilton/pr

Amilton/pr

26/09/2005

Acho que tá resolvido. ficou assim:
SELECT Distinct(Contrib.NumeroInscricao), Contrib.Nome, Contrib.Endereco, Contrib.NumeroCGC, Contrib.DescAti, Contrib.DescAti1, Contrib.Numero, Contrib.Bairro, Contrib.Cidade, Contrib.Cep, Contrib.Uf, Ativ.Atividade,
Paramet.CodigoMunicipio, Paramet.Municipio, Paramet.Endereco, Paramet.Bairro, Paramet.Cidade, Paramet.Cep, Paramet.Uf,
Calctll.ValorTLL, Calctll.ValorTLP, Calctll.ValorTVFRE,
Calcthe.ValorTHE, Calctsvs.ValorTSVS
FROM ´CONTRIB.DB´ Contrib
INNER JOIN ´ATIV.DB´ Ativ
ON (Ativ.CodAtiv = Contrib.Ativid)
INNER JOIN ´CALCTLL.DB´ Calctll
ON (Calctll.NumeroInscricao = Contrib.NumeroInscricao)
INNER JOIN ´CALCTHE.DB´ Calcthe
ON (Calcthe.NumeroInscricao = Contrib.NumeroInscricao)
INNER JOIN ´CALCTSVS.DB´ Calctsvs
ON (Calctsvs.NumeroInscricao = Contrib.NumeroInscricao) ,
´PARAMET.DB´ Paramet
Order By Ativ.Atividade

Tem a Tabela de Parametros a mais mas não influenciaria no resultado.
Me pareceu que usar Left Join, Right Join e Inner Join nas tabelas não produziram efeitos diferentes.
Quero agradecer muito a ajuda de todos e estamos abertos para comentários.
Muito Obrigado.


GOSTEI 0
POSTAR