Banco de dados - Cadastrar cidade para Pai, mãe, conjuge na mesma tabela
Olá pessoal
Boa noite,
Gostaria da ajuda dos colegas aqui no fórum para uma seguinte situação, eu tenho um banco de dados para cadastro de Pessoas, eu modelei ele para receber a tabela de cidades, onde na tabela de pessoas apareceu a seguinte necessidade cadastrar Cidades para pai, mãe, cônjuge e para a pessoa cadastrada também, eu gostaria de cadastrar o código desta cidade relacionando ela com a tabela usando a chave estrangeira, e a imagem de como é o cadastro.
[img:descricao=ImagemDevMedia]http://arquivo.devmedia.com.br/forum/imagem/251195-20140711-014650.png[/img]
Até aí tudo bem, o problema é quando vou utilizar um Join para mostrar esses dados, eles não me retornam corretamente, vou postar o código SQL, do select
Estou Utilizando Delphi 2010 e Firebird 2.5
Boa noite,
Gostaria da ajuda dos colegas aqui no fórum para uma seguinte situação, eu tenho um banco de dados para cadastro de Pessoas, eu modelei ele para receber a tabela de cidades, onde na tabela de pessoas apareceu a seguinte necessidade cadastrar Cidades para pai, mãe, cônjuge e para a pessoa cadastrada também, eu gostaria de cadastrar o código desta cidade relacionando ela com a tabela usando a chave estrangeira, e a imagem de como é o cadastro.
[img:descricao=ImagemDevMedia]http://arquivo.devmedia.com.br/forum/imagem/251195-20140711-014650.png[/img]
Até aí tudo bem, o problema é quando vou utilizar um Join para mostrar esses dados, eles não me retornam corretamente, vou postar o código SQL, do select
SELECT PESSOA.PES_ID, PESSOA.COMUNIDADE_COM_ID, COMUNIDADE.COM_NME_OFFICIAL, PESSOA.PES_APELIDO, PESSOA.PES_CPF, PESSOA.PES_DTA_CADASTRO, PESSOA.PES_DTA_NASC, PESSOA.PES_ESTADOCIVIL, PESSOA.PES_ESCOLARIDADE, PESSOA.PES_ENDERECO, PESSOA.PES_INICIAL, PESSOA.PES_RG, PESSOA.PES_SEXO, PESSOA.PES_IDADE, PESSOA.PES_MOTIVO_AFASTAMENTO, PESSOA.PES_NATURALIDADE_OPCAO, PESSOA.PES_NATUR_OPCAO_PAI, PESSOA.PES_NATUR_OPCAO_MAE, PESSOA.PES_NATUR_OPCAO_CONJ, PESSOA.PES_NOME, PESSOA.PES_PROFISSAO, PESSOA.PES_PROFISSAOMAE, PESSOA.PES_PROFISSAOPAI, PESSOA.PES_PROFISSAOCONJUGUE, PESSOA.PES_RELIGIAO, PESSOA.PES_TIPORENDA, PESSOA.PES_FAIXA_ETARIA, PESSOA.PES_CRIA_PAIS, PESSOA.PES_CRIA_NEGA_MAE_ADO, PESSOA.PES_CRIA_NEGA_PAI_ADO, PESSOA.PES_TPO_PESSOA, PESSOA.PES_OBSGERAL, PESSOA.PES_PAI, PESSOA.PES_MAE, CIDADE.MUNICIPIO FROM COMUNIDADE INNER JOIN PESSOA ON (COMUNIDADE.COM_ID=PESSOA.COMUNIDADE_COM_ID) INNER JOIN CIDADE ON (PESSOA.PES_NATURALIDADE_OPCAO=CIDADE.CID_ID) AND (PESSOA.PES_NATUR_OPCAO_PAI=CIDADE.CID_ID) AND (PESSOA.PES_NATUR_OPCAO_MAE=CIDADE.CID_ID) AND (PESSOA.PES_NATUR_OPCAO_CONJ=CIDADE.CID_ID)
Estou Utilizando Delphi 2010 e Firebird 2.5
Cleber Santos
Curtidas 0
Respostas
Guilherme
11/07/2014
Meu querido, a forma que está usando parece incorreta, pois se caso um dos itens não estiver sido preenchido, não irá retornar registros, pois está usando uma relação um para um (INNER JOIN). Vou colocar aqui a provável solução. Faça o ajuste no seu sistema e depois informe o resultado.
Use INNER JOIN sempre que tiver certeza que na tabela de destino tem registro, pois se não tiver no campo o registro não irá retornar nada, principalmente na situação que a naturalidade de pai, mãe e conjugue não estiverem sido preenchido por isso AND na clausula de relacionamento.
FROM
COMUNIDADE
INNER JOIN PESSOA ON (COMUNIDADE.COM_ID=PESSOA.COMUNIDADE_COM_ID)
INNER JOIN CIDADE ON (PESSOA.PES_NATURALIDADE_OPCAO=CIDADE.CID_ID)
AND (PESSOA.PES_NATUR_OPCAO_PAI=CIDADE.CID_ID)
AND (PESSOA.PES_NATUR_OPCAO_MAE=CIDADE.CID_ID)
AND (PESSOA.PES_NATUR_OPCAO_CONJ=CIDADE.CID_ID)
Alterando seu SQL:
SELECT
...
...,
CIDADE_NATURALIDADE.CID_ID,
CIDADE_MAE.CID_ID,
CIDADE_PAI.CID_ID,
CIDADE_CONJ.CID_ID,
...
...
FROM
COMUNIDADE
INNER JOIN
PESSOA
ON (COMUNIDADE.COM_ID=PESSOA.COMUNIDADE_COM_ID)
LEFT JOIN
CIDADE AS CIDADE_NATURALIDADE
ON (PESSOA.PES_NATURALIDADE_OPCAO=CIDADE_NATURALIDADE.CID_ID)
LEFT JOIN
CIDADE AS CIDADE_MAE
ON (PESSOA.PES_NATUR_OPCAO_MAE=CIDADE_MAE.CID_ID)
LEFT JOIN
CIDADE AS CIDADE_PAI
ON (PESSOA.PES_NATUR_OPCAO_PAI=CIDADE_PAI.CID_ID)
LEFT JOIN
CIDADE AS CIDADE_CONJ
ON (PESSOA.PES_NATUR_OPCAO_CONJ=CIDADE_CONJ.CID_ID)
Abraços
Use INNER JOIN sempre que tiver certeza que na tabela de destino tem registro, pois se não tiver no campo o registro não irá retornar nada, principalmente na situação que a naturalidade de pai, mãe e conjugue não estiverem sido preenchido por isso AND na clausula de relacionamento.
FROM
COMUNIDADE
INNER JOIN PESSOA ON (COMUNIDADE.COM_ID=PESSOA.COMUNIDADE_COM_ID)
INNER JOIN CIDADE ON (PESSOA.PES_NATURALIDADE_OPCAO=CIDADE.CID_ID)
AND (PESSOA.PES_NATUR_OPCAO_PAI=CIDADE.CID_ID)
AND (PESSOA.PES_NATUR_OPCAO_MAE=CIDADE.CID_ID)
AND (PESSOA.PES_NATUR_OPCAO_CONJ=CIDADE.CID_ID)
Alterando seu SQL:
SELECT
...
...,
CIDADE_NATURALIDADE.CID_ID,
CIDADE_MAE.CID_ID,
CIDADE_PAI.CID_ID,
CIDADE_CONJ.CID_ID,
...
...
FROM
COMUNIDADE
INNER JOIN
PESSOA
ON (COMUNIDADE.COM_ID=PESSOA.COMUNIDADE_COM_ID)
LEFT JOIN
CIDADE AS CIDADE_NATURALIDADE
ON (PESSOA.PES_NATURALIDADE_OPCAO=CIDADE_NATURALIDADE.CID_ID)
LEFT JOIN
CIDADE AS CIDADE_MAE
ON (PESSOA.PES_NATUR_OPCAO_MAE=CIDADE_MAE.CID_ID)
LEFT JOIN
CIDADE AS CIDADE_PAI
ON (PESSOA.PES_NATUR_OPCAO_PAI=CIDADE_PAI.CID_ID)
LEFT JOIN
CIDADE AS CIDADE_CONJ
ON (PESSOA.PES_NATUR_OPCAO_CONJ=CIDADE_CONJ.CID_ID)
Abraços
GOSTEI 0
Cleber Santos
11/07/2014
Olá boa tarde,
Pelo que você postou eu preciso fazer a alteração na tabela de cidade alterando estes campos,
que tem na tabela de pessoa?
Lembrando esta relação quem recebe os dados da tabela é a de cliente, que recebe o código da cidade, o problema é a fazer o join e mostrar o código e o nome da cidade para aqueles campos...
Pelo que você postou eu preciso fazer a alteração na tabela de cidade alterando estes campos,
que tem na tabela de pessoa?
Lembrando esta relação quem recebe os dados da tabela é a de cliente, que recebe o código da cidade, o problema é a fazer o join e mostrar o código e o nome da cidade para aqueles campos...
GOSTEI 0
Cleber Santos
11/07/2014
Olá meus amigos
fiz uns ajustes e consegui o resultado alterando no
Select
e Nos Joins
Assim conseguir um resultado que dá para prosseguir com o sistema, havendo alguma duvida mais eu volto a postar neste topico
fiz uns ajustes e consegui o resultado alterando no
Select
CIDADE_NATURALIDADE.MUNICIPIO, CIDADE_PAI.MUNICIPIO, CIDADE_MAE.MUNICIPIO, CIDADE_CONJ.MUNICIPIO
e Nos Joins
FROM COMUNIDADE INNER JOIN PESSOA ON (COMUNIDADE.COM_ID=PESSOA.COMUNIDADE_COM_ID) LEFT OUTER JOIN CIDADE CIDADE_NATURALIDADE ON (PESSOA.PES_NATURALIDADE_OPCAO=CIDADE_NATURALIDADE.CID_ID) LEFT OUTER JOIN CIDADE CIDADE_MAE ON (PESSOA.PES_NATUR_OPCAO_MAE=CIDADE_MAE.CID_ID) LEFT OUTER JOIN CIDADE CIDADE_PAI ON (PESSOA.PES_NATUR_OPCAO_PAI=CIDADE_PAI.CID_ID) LEFT OUTER JOIN CIDADE CIDADE_CONJ ON (PESSOA.PES_NATUR_OPCAO_CONJ=CIDADE_CONJ.CID_ID)
Assim conseguir um resultado que dá para prosseguir com o sistema, havendo alguma duvida mais eu volto a postar neste topico
GOSTEI 0