Ir para conteúdo
Fórum Script Brasil
  • 0

Utilizaçao de join em 03 tabelas


Vanessa Mendes da Silva

Pergunta

Boa Noite!

Gostaria de um auxilio para conseguir gerar o banco abaixo vou mandar a descrição total para melhor entendimento e embaixo a maneira como estou fazendo.

Segue:

Executar o script de criação do banco de dados no link http://umcdb2.wordpress.com/2010/11/26/cri...anco-de-regioes

Um banco de dados tem um conjunto de tabelas que representa um cadastro de regiões geográficas. As regiões podem ser categorizada por Continente, Pais, Região, Estado (Província), cidades, etc…

Elas estão dividídas em 3 tabelas:

Regiao

TipoRegiao

GrupoRegiao

Na tabela Regiao temos as seguintes colunas:

IDRegiao int

Nome char(50)

IDTipoRegiao int

Ela representa o cadastro da região. Um nome de continente(Europa), ou um Pais(Brasil) ou um estado (Miami), por exemplo

Na tabela TipoRegiao:

IDTipoRegiao int

Nome char(50)

Contém a tipificação da Região. Ela tem relacionamento com a tabela Região

Na tabela GrupoRegiao:

IDGrupoRegiao int

IDRegiaoPai int

IDRegiaoFilho int

Essa tabela relaciona as regiões. Com isso, é possivel determinar quais os paises de um continente ou quais os estados de um pais. Para manter essa relação, temos duas colunas(IDRegiaoPai e IDRegiaoFilho). Cada uma desse colunas tem relação com a tabela Região. Dessa forma, a região de ID 7 (Europa) está relacionada com a região de ID 18 (United Kingdom – Reino Unido).

Para entender com as tabelas funcionam, façam os select abaixo

select * from TipoRegiaoEssa tabela mostra os tipo de região. Veja de Continente é o codigo 1 e Pais o código 2.

select * from regiaoEssa tabela tem a relação das regiões. Se voce filrar somente as regiões do tipo região igual a 1

select * from regiao where idTipoRegiao = 1Veja que é apresentado os nome das regiões Continentes. Nessa caso, a Europa é o codigo 7.

Select * from regiao where idTipoRegiao = 2 order by idRegiaoEssa select filtra somente as regiões que são paises. Veja que o pais United Kingdom é o numero 18.

Select * from GrupoRegiaoEssa tabela mantém a relação entre as regiões. No caso, entendemos que a região de nome Europa contém a região de nome United Kingdom.

Então essas duas regiões estão dentro dessa tabela. Faça o select abaixo

Select * from GrupoRegiao where iDRegiaoPai = 7Veja que para mostra o id da regiao pai de codigo 7 que significa Europa, ele mostrou o id da regiao filho de codigo 18 que significa United Kingdom.

Agora vamos usar o codigo 18 para filtrar da tabela GrupoRegiao, quem são os codigo filhos.

Select * from GrupoRegiao where iDRegiaoPai = 18O que foi apresentado são todos os estados da regiao 18 que é o United Kingdom. O select abaixo mostra quais os nomes dos estados da região 18.

select * from regiao where idregiao in( 496 , 387, 349 , 436)Com essas tabelas e o banco criado conforme link acima, voce tem que desenvolver UM comando SELECT que apresente os seguintes dados:

7 Europa 18 United Kingdom UK 496 England

7 Europa 18 United Kingdom UK 387 Northern Ireland

7 Europa 18 United Kingdom UK 349 Scotland

7 Europa 18 United Kingdom UK 436 Wales

Essa é a relação dos estados/provincias do pais United Kingdom (Reino Unido) que está no Continente Europa.

Estou fazendo da seguinte maneira, porem não consigo o nome do continente com o nome do pais

select * from Regiao
join GrupoRegiao
   on Regiao.idRegiao = GrupoRegiao.idRegiaoPai
   join TipoRegiao
   on Regiao.idRegiao = GrupoRegiao.idRegiaoPai
   where idRegiao = 7 and idRegiaoPai = 18

Se alguém puder me ajudar..

Obrigada!!

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Bom dia Vanessa,

É... me parece que isto é trabalho de faculdade... rs.

Sempre falo aqui no Forum que não gosto de ajudar quando é trabalho. Este é o momento de estudar e aprender!!

Uma dica: você terá que referenciar a tabela Regiao duas vezes. Uma pra recuperar o Pai e outra pro Filho.

Ex.:

SELECT Pai.Nome, Filho.Nome FROM GrupoRegiao g
INNER JOIN regiao Pai ON g.idRegiaoPai = Pai.idRegiao
INNER JOIN regiao Filho ON g.idRegiaoFilho = Filho.idRegiao

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigada...

Então pe realmente um trabalho da faculdade e do aprendendo mesmo viu, pois etou trabalhando nele há alguns dias quando comecei fiz da seguinte forma:

Select E.IDREGIAO, E.NOME AS DSC_CONTINENTE, B.IDREGIAO, B.NOME AS DSC_PAIS , C.IDREGIAO, C.NOME AS DSC_REGIAO 
from GrupoRegiao D, GrupoRegiao a, REGIAO B, REGIAO C, REGIAO E 
where D.iDRegiaoPai = 7 AND D.IDREGIAOFILHO = D.iDRegiaoPai AND D.iDRegiaoPai

Porem da erro e não utiliza o join mas sera que desta forma eu conseguiria??

Obrigada

Link para o comentário
Compartilhar em outros sites

  • 0

Assim também dá. É a mesma coisa de utilizar o JOIN (padrão ANSI). Apenas a sintaxe é diferente...

No exemplo que postou, parece que ficou faltando o final, pois depois do ultimo AND o campo iDRegiaoPai não possui uma relação.

Na cláusula FROM você referencia duas vezes a tabela GrupoRegiao e três vezes a tabela Regiao. Creio que não haveria necessidade. Se referenciar as tabelas e não realizar a correlação entre as chaves, o sql irá exponenciar o resultado.

Duas formas de escrever a mesma pesquisa:

SELECT Pai.Nome, Filho.Nome FROM GrupoRegiao g
INNER JOIN regiao Pai ON g.idRegiaoPai = Pai.idRegiao
INNER JOIN regiao Filho ON g.idRegiaoFilho = Filho.idRegiao

SELECT Pai.Nome, Filho.Nome FROM GrupoRegiao g, regiao Pai, regiao Filho
WHERE g.idRegiaoPai = Pai.idRegiao and g.idRegiaoFilho = Filho.idRegiao

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigada!!! Fulvio pela orientação.

Gostaria agora de tirar uma duvida sobre o primeiro select no caso em que colcamos Pai.Nome e Filho.Nome estamos trazendo os dados que estão no nome do região pai e filho??

E no from voce nomeia o GrupoRegião como g para referencia-la no Join??

Aproveitando que você esta me ajudando gostaria de tirar essas duvidas

Agradeço muito

Link para o comentário
Compartilhar em outros sites

  • 0

Isso aí. Perceba que coloco um "apelido" para a tabela Regiao, que é "Pai" e "Filho".

Este "apelido" de chama ALIAS. É a mesma coisa quando falo "GrupoRegiao g" ou "GrupoRegiao AS g" (o AS pode ser suprimido).

Se não colocasse, por exemplo o "g" como Alias, toda vez que fizesse referência à tabela, teria que digitá-la. Ex.:

GrupoRegiao.idRegiaoPai = idRegiao and GrupoRegiao.idRegiaoFilho = ...
Para facilitar, coloco o "g" como Alias. Ficaria:
g.idRegiaoPai = idRegiao and g.idRegiaoFilho = ...

Quando você referencia a mesma tabela no select (igual no seu caso), a utilização do Alias é imprescindível. Se não usar o sql dará erro de ambiguidade, pois não saberá qual a coluna manipular.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...