Simplificar consulta SQL

Delphi

28/08/2012

Estou desenvolvendo um sistema para Imobiliária e para impressão do contrato estou utilizando o código SQL abaixo, porém está muito complexo e só está aparecendo um contrato, todos os novos que eu tento adicionar não aparece.

Link dos bancos:
http://www.rochanet.com.br/easyimobiliaria/

Código SQL utilizado:
SELECT bpm_contratos.IDCONTRATO, bpm_contratos.DATA_CONTRATO, bpm_contratos.IDIMOVEL, bpm_contratos.IDLOCADOR, bpm_contratos.IDLOCATORIO, bpm_contratos.IDFIADOR, bpm_contratos.DATAINICIO_CONTRATO, bpm_contratos.DATATERMINO_CONTRATO, bpm_contratos.VALORCONTRATO, bpm_contratos.VALOR_EXTENSO_CONTRATO, bpm_contratos.DIAVENCI_CONTRATO, bpm_contratos.DIAVENCI_EXTENSO_CONTRATO, bpm_contratos.ALUGUEL_CONTRATO, bpm_contratos.ALUGUEL_EXTENSO_CONTRATO, bpm_contratos.QTD_PARCELAS, bpm_contratos.QTD_PARCELAS_EXTENSO, bpm_contratos.IDFORMA_PGTO, bpm_contratos.RTF_CONTRATO, bpm_contratos.CORPO_CONTRATO, bpm_contratos.STATUS, bpm_imovel.NomeImovel, bpm_imovel.DescicaoImovel, bpm_imovel.EnderecoImovel, bpm_imovel.NumeroImovel, IMV_cidade.Nome AS CidadeImovel, bpm_imovel.BairroImovel, bpm_imovel.Abrev AS UFImovel, bpm_imovel.CEPImovel, Locador.cnpjcpf AS CPFCNPJLocador, Locador.nome AS NomeLocador, Locador.NACIONALIDADELocador AS NACIONALIDADElOCADOR, LCD_Endereco.Logadouro AS LogadouroLocador, LCD_Endereco.Numero AS NumeroLocador, LCD_Endereco.Complemento AS ComplementoLocador, LCD_Endereco.Bairro AS BairroLocador, LCD_Endereco.CEP AS CEPLocador, LCD_Endereco.CxPostal AS CxPostalLocador, LCD_Endereco.Abrev AS UFLocador, LCD_cidade.Nome AS CidadeNomeLocador, LCD_tipocontato.NomeTipoContato AS NomeTipoContatoLocador, LCD_contato.descricao AS ContatoLocador, LCD_estadocivil.descricao_estadocivil AS descricao_estadocivilLocador, Locador.PROFISSAO AS PROFISSAOLocador, Locatorio.NomePessoa AS NomeLocatario, Locatorio.cnpjcpf AS CPFCNPJLocatorio, Locatorio.Profissao AS PROFISSAOLocatorio, Locatorio.NACIONALIDADELocatorio AS NACIONALIDADELocatorio, LCT_estadocivil.descricao_estadocivil AS EstadoCivilLocatorio, LCT_endereco.Logadouro AS LogadouroLocatario, LCT_endereco.Numero AS NumeroLocatario, LCT_endereco.Complemento AS ComplementoLocatario, LCT_endereco.Bairro AS BairroLocatario, LCT_endereco.CEP AS CEPLocatario, LCT_endereco.CxPostal AS CxPostalLocatario, LCT_endereco.Abrev AS UFLocatario, LCT_cidade.Nome AS CidadeLocatario, LCT_tipocontato.NomeTipoContato AS TpContatoLocatario, LCT_contato.descricao AS ContatoLocatario, Representante.NomePessoa AS RepresentanteLegal, RPL_endereco.Logadouro AS LogadouroRpLegal, RPL_endereco.Numero AS NumeroRpLegal, RPL_endereco.Complemento AS ComplementoRpLegal, RPL_endereco.Bairro AS BairroRpLegal, RPL_endereco.CEP AS CEPRpLegal, RPL_endereco.CxPostal AS CxPostalRpLegal, RPL_endereco.Abrev AS UFRpLegal, RPL_cidade.Nome AS CidadeRpLegal, RPL_contato.descricao AS ContatoRpLegal, RPL_tipocontato.NomeTipoContato AS TpContatoRpLegal, Representante.NACIONALIDADE AS NACIONALIDADERpLegal, Representante.PROFISSAO AS PROFISSAORpLegal, Representante.cpfcnpj AS cpfcnpjRpLegal, Representante.numerodocumentoidentidade AS numerodocumentoidentidadeRpLegal, RPL_estadocivil.descricao_estadocivil AS EstadoCivilRpLegal, Fiador.nomepessoa AS NomeFiador, Fiador.cpfcnpj AS CPFCNPJFiador, Fiador.NACIONALIDADE AS NACIONALIDADEFiador, Fiador.PROFISSAO AS PROFISSAOFiador, Fiador_estadocivil.descricao_estadocivil AS EstadoCivilFiador, Fiador_endereco.Logadouro AS LogadouroFiador, Fiador_endereco.Numero AS NumeroFiador, Fiador_endereco.Complemento AS ComplementoFiador, Fiador_endereco.Bairro AS BairroFiador, Fiador_endereco.CEP AS CEPFiador, Fiador_endereco.CxPostal AS CxPostalFiador, Fiador_endereco.Abrev AS UFFiador, Fiador_cidade.Nome AS CidadeFiador, Fiador_tipocontato.NomeTipoContato AS TpContatoFiador, Fiador_contato.descricao AS ContatoFiador
FROM (((((((((((((((((bmp_dadoslocador AS Locador INNER JOIN ((bpm_contratos INNER JOIN bpm_imovel ON bpm_contratos.IDIMOVEL = bpm_imovel.IdImovel) LEFT JOIN cidade AS IMV_cidade ON bpm_imovel.IdCidade = IMV_cidade.CidadeId) ON Locador.idpessoa = bpm_contratos.IDLOCADOR) LEFT JOIN endereco AS LCD_Endereco ON bpm_contratos.IDLOCADOR = LCD_Endereco.IdPessoa) LEFT JOIN (tipocontato AS LCD_tipocontato RIGHT JOIN bpm_contato AS LCD_contato ON LCD_tipocontato.IdTipoContato = LCD_contato.IdTipoContato) ON bpm_contratos.IDLOCADOR = LCD_contato.IdPessoa) LEFT JOIN cidade AS LCD_cidade ON LCD_Endereco.CidadeId = LCD_cidade.CidadeId) LEFT JOIN estadocivil AS LCD_estadocivil ON Locador.idestadocivil = LCD_estadocivil.idestadocivil) LEFT JOIN bmp_dadoslocatorio AS Locatorio ON bpm_contratos.IDLOCATORIO = Locatorio.IdLocatorio) LEFT JOIN (endereco AS LCT_endereco LEFT JOIN cidade AS LCT_cidade ON LCT_endereco.CidadeId = LCT_cidade.CidadeId) ON bpm_contratos.IDLOCATORIO = LCT_endereco.IdPessoa) LEFT JOIN (bpm_contato AS LCT_contato LEFT JOIN tipocontato AS LCT_tipocontato ON LCT_contato.IdTipoContato = LCT_tipocontato.IdTipoContato) ON bpm_contratos.IDLOCATORIO = LCT_contato.IdPessoa) LEFT JOIN estadocivil AS LCT_estadocivil ON Locatorio.idestadocivil = LCT_estadocivil.idestadocivil) LEFT JOIN bpm_pessoa AS Representante ON Locatorio.IdRepresentante = Representante.idpessoa) LEFT JOIN (endereco AS RPL_endereco LEFT JOIN cidade AS RPL_cidade ON RPL_endereco.CidadeId = RPL_cidade.CidadeId) ON Representante.idpessoa = RPL_endereco.IdPessoa) LEFT JOIN (bpm_contato AS RPL_contato LEFT JOIN tipocontato AS RPL_tipocontato ON RPL_contato.IdTipoContato = RPL_tipocontato.IdTipoContato) ON Representante.idpessoa = RPL_contato.IdPessoa) LEFT JOIN estadocivil AS RPL_estadocivil ON Representante.idestadocivil = RPL_estadocivil.idestadocivil) LEFT JOIN bpm_pessoa AS Fiador ON Locatorio.IdFiador = Fiador.idpessoa) LEFT JOIN endereco AS Fiador_endereco ON Locatorio.IdFiador = Fiador_endereco.IdPessoa) LEFT JOIN estadocivil AS Fiador_estadocivil ON Fiador.idestadocivil = Fiador_estadocivil.idestadocivil) LEFT JOIN (tipocontato AS Fiador_tipocontato RIGHT JOIN bpm_contato AS Fiador_contato ON Fiador_tipocontato.IdTipoContato = Fiador_contato.IdTipoContato) ON Locatorio.IdFiador = Fiador_contato.IdContato) LEFT JOIN cidade AS Fiador_cidade ON Fiador_endereco.CidadeId = Fiador_cidade.CidadeId WHERE (((bpm_contratos.IDCONTRATO)=:IdContato))
Paulo Andrade

Paulo Andrade

Curtidas 0

Respostas

William

William

28/08/2012

Qual banco SGBD vc está usando?

OBS.:Colega não sei se é o seu caso, mas existem situações em que o excesso de normalizações no banco de dados podem ocasionar essa complexidade para montar uma instrução SQL, já li até literaturas falando sobre Desnormalização de banco de dados.
GOSTEI 0
Eduardo Gonçalves

Eduardo Gonçalves

28/08/2012

verdade, às vezes é melhor desnormalizar para que as consultas SQL fiquem menos complexas. Essa query ficou excessivamente difícil, talvez seja melhor quebrá-la em mais de uma query e fazer o tratamento da informação que você necessita em uma stored procedure ou até mesmo dentro do Delphi.
GOSTEI 0
Paulo Andrade

Paulo Andrade

28/08/2012

Como eu estou utilizando o banco Access conforme link do banco que postei acima, não teria como utilizar procedure. Obrigado pela ajuda, mas se poder me auxiliar em como criar isso no Delphi, ficaria grato.

Seria o caso de criar outros DataSet separando cada item?

Ex.:
DataSetLocador
DataSetLocatario
DataSetFiador...
GOSTEI 0
William

William

28/08/2012

Em Access é barra hein ...

Quantas tabelas estão envolvidas na consulta?

Vamos tentar primeiro reduzir essa instrução SQL e posteriormente encontrar o problema de só trazer um contrato.
GOSTEI 0
Paulo Andrade

Paulo Andrade

28/08/2012

Em Access é barra hein ...

Quantas tabelas estão envolvidas na consulta?

Vamos tentar primeiro reduzir essa instrução SQL e posteriormente encontrar o problema de só trazer um contrato.


Na verdade, todos estão na tabela Pessoas, o que diferencia é um campo boolean. Se el for fiador, no campo fiador da tabela pessoas estará como true.
GOSTEI 0
William

William

28/08/2012

Eu achei mais de uma tabela envolvida na consulta, seguem algumas abaixo:

1 - bpm_contratos
2 - bpm_imovel
3 - Locador
4 - IMV_cidade
5 - LCD_Endereco
6 - LCD_cidade
7 - Locatorio
8 - LCD_tipocontato
9 - LCT_estadocivil
10 - RPL_contato
etc.....

Volto a perguntar, quantas tabelas estão envolvidas na consulta?
GOSTEI 0
Paulo Andrade

Paulo Andrade

28/08/2012

Eu achei mais de uma tabela envolvida na consulta, seguem algumas abaixo:

1 - bpm_contratos
2 - bpm_imovel
3 - Locador
4 - IMV_cidade
5 - LCD_Endereco
6 - LCD_cidade
7 - Locatorio
8 - LCD_tipocontato
9 - LCT_estadocivil
10 - RPL_contato
etc.....

Volto a perguntar, quantas tabelas estão envolvidas na consulta?


São 27 tabelas no total.

O que preciso no sistema é:
Dados de Locador
Dados Locatário (endereço,documento,contato,dados trabalho)
Dados fiador (endereço,documento,contato,dados trabalho)
dados conjugue
dados representante legal
dados do contrato
GOSTEI 0
POSTAR