rogerss_7 0 Denunciar post Postado Janeiro 22, 2014 Olá, tenho tabelas nesta estrutura ----tb_customer---- id_customer ----tb_history---- id_history id_customer id_typehistory ----tb_typehistory---- id_typehistory Meu objeto principal é tb_customer. Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
Roberto Fagundes 40 Denunciar post Postado Janeiro 22, 2014 select a.id_customer, b.id_history, c.id_typehistory from tb_customer a inner join tb_history b on a.id_customer = b.id_customer inner join tb_typehistory c on b.id_typehistory = c.id_typehistory; A relação dessas tabelas ficaria desta forma. Compartilhar este post Link para o post Compartilhar em outros sites
rogerss_7 0 Denunciar post Postado Janeiro 22, 2014 Obrigado Roberto, mas tenho um problema que é em relação ao join. tb_history pode não ter dados de tb_typehistory tb_history pode não ter dados de tb_customer O correto seria um left join, mas já tentei e não consigo fazer funcionar um left join desta maneira. Por isso estava tentando Load, que aliás estava funcionando até relacionar com tb_typehistory. Compartilhar este post Link para o post Compartilhar em outros sites
Roberto Fagundes 40 Denunciar post Postado Janeiro 22, 2014 Então a tabela principal é a history, ai você coloca o left na typehistory e na customer Compartilhar este post Link para o post Compartilhar em outros sites
rogerss_7 0 Denunciar post Postado Janeiro 22, 2014 Sim, da maneira que é lida a estrutura o seu comentário está correto. Mas vou explicar como estou fazendo. Estou criando uma lista do tipo tb_customer, após isso eu carrego tb_history e deveria também carregar tb_typehistory, para ser usado em outro momento. Compartilhar este post Link para o post Compartilhar em outros sites
Roberto Fagundes 40 Denunciar post Postado Janeiro 22, 2014 Então fica complicado fazer isso, porque você quer pegar o id da tabela customer que não existe para comparar com a tabela history Compartilhar este post Link para o post Compartilhar em outros sites
xanburzum 169 Denunciar post Postado Janeiro 22, 2014 não esqueça do relacionamento entre as tabelas, na verdade, a importância de uma modelagem de dados bem definida até os mínimos detalhes, como os campos de relacionamentos, um velho ditado diz, que um relacionamento bem definido é a alma do aplicativo, pois daí saem todas as consultas e operações com o banco, influenciando diretamente na otimização e performance do aplicativo Compartilhar este post Link para o post Compartilhar em outros sites
rogerss_7 0 Denunciar post Postado Janeiro 22, 2014 Ok, entendo. Mas pra finalizar você poderia me mostrar como seria um left join entre estas estruturas? Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
Roberto Fagundes 40 Denunciar post Postado Janeiro 22, 2014 select a.id_customer, a.id_history, a.id_typehistory from tb_history a left join tb_customer b on a.id_customer = b.id_customer left join tb_typehistory c on a.id_typehistory = c.id_typehistory; Eu faria desta forma. Compartilhar este post Link para o post Compartilhar em outros sites
xanburzum 169 Denunciar post Postado Janeiro 22, 2014 Diferenças entre LEFT, RIGHT e INNER Quando dizemos que a tabela será Left ou Right, estamos informando ao comando SQL que ele deve obedecer o sentido para a Direita ou para a Esquerda, ou seja, ao utilizarmos Left Join o banco de dados irá analisar a estrutura da tabela da Direita e comparar com a tabela da Esquerda (leia-se Direita para a Esquerda), veja o desenho. Left JoinNa primeira situação temos o Left Join, a seta está apontando para a tabela FUNCIONARIOS simbolizando que a precedência é da tabela da Esquerda, então podemos dizer que no select abaixo, serão listados todos os Funcionários, mesmo aqueles que não tem Filial cadastrada. SELECT A.FUN_NOME, B.FIL_NOME FROM FUNCIONARIOS ALEFT JOIN FILIAL B ON A.FIL_CODIGO = B.FIL_CODIGO -- RESULTADO DA CONSULTA --FUN_NOME FIL_NOMEJOÃO MATRIZJOAQUIM FILIAL 1JOSÉ FILIAL 1MÁRCIO FILIAL 2PEDRO nullRepare que Pedro foi incluído no resultado, porém ele não possui uma Filial associada em seu cadastro. Este tipo de Join é o mais utilizado quando não se tem certeza que todos os registros possuem ligação entre as tabelas e também na maioria das vezes por questões de desempenho. Right JoinNa segunda situação foi utilizado o Right Join, também conhecido apenas por Join, que aponta para a tabela FILIAL simbolizando a precedência da tabela da Direita, logo, concluímos que os dados da tabela Filial devem existir para que o registro seja trazido no Select. SELECT A.FUN_NOME, B.FIL_NOME FROM FUNCIONARIOS ARIGHT JOIN FILIAL B ON A.FIL_CODIGO = B.FIL_CODIGO-- AINDA PODEMOS UTILIZAR SEM A PALAVRA RIGHT/*SELECT A.FUN_NOME, B.FIL_NOME FROM FUNCIONARIOS AJOIN FILIAL B ON A.FIL_CODIGO = B.FIL_CODIGO*/ -- RESULTADO DA CONSULTA --FUN_NOME FIL_NOMEJOÃO MATRIZJOAQUIM FILIAL 1JOSÉ FILIAL 1MÁRCIO FILIAL 2 Note que o funcionário Pedro desta vez não foi incluído na lista de resultados, isto ocorreu porque esta consulta traz apenas registros onde existe um cadastro de Filial para o Funcionário. Inner Join Temos ainda a situação do Inner Join que nada mais faz do que observar se existem registros combinados em ambas as tabelas, ou seja, para que um registro seja incluído na lista de resultados, o campo de ligação entre duas tabelas deve satisfazer as condições em ambas. O resultado desta consulta seria algo muito semelhante ao Join. Fonte:http://www.prosige.com.br/portal/index.php?option=com_content&view=article&id=58:diferenca-entre-left-right-e-inner-join&catid=1:bancodedados&Itemid=55 Compartilhar este post Link para o post Compartilhar em outros sites
rogerss_7 0 Denunciar post Postado Janeiro 22, 2014 Obrigado caras pela atenção. Sobre a questão dos tipos de relacionamentos, eu entendo sim como tudo funciona, mas a dúvida sempre foi em relação ao método Load do EntityFramework e/ou como relacionar como left join através do recurso Linq to SQL (que havia comentado que não estava conseguindo fazer funcionar). Compartilhar este post Link para o post Compartilhar em outros sites