Consulta entre tabelas

Boa noite pessoa, estou tentando fazer uma consulta em SQL mas não sei se essa é possivél…

TENHO 3 TABELAS

PESSOA, FORNECEDOR E CIDADE

a tabela PESSOA tem uma chave estrangeira de cidade ja a tabela FORNECEDOR tem uma chave estrangeira de pessoa e outra de cidade.

Gostaria de trazer na consula os dados de pessoa e fornecedor onde as chaves são iguais isso onde isso ja fiz. assim Select p.* FROM pessoa p INNER JOIN p.id_pessoa = f.cod_pessoa. Porem gostaria de trazer tb na mesma consulta as cidades de pessoa e tb a de fornecedor sendo que as cidades das tabelas pessoa e fornecedor são diferentes.

Ate consegui trazer as cidades da tabela pessoa junto na SQL porem não consegui juntar a da fornecedor tb ou seja retornar as cidades da tabela fornecedor atraves da chaves estrangeira.

se alguem puder ajudar agradeço

Obrigado

Tente usar subconsultas para a cidade de um deles(forneces ou pessoa)… seria mais ou menos assim:

SELECT p.nome, c.nome_cidade, f.nome, (SELECT nome_cidade FROM cidade WHERE id=f.id_cidade) as cidade_fornecedor FROM pessoa p INNER JOIN cidade c INNER JOIN fornecedor f WHERE p.id=c.id and p.id=f.id

Se entendi direito o que você precisa creio que também possa ser feito assim, com duas referências de cidade para obter seus resultados distintos:


SELECT f.nome, c.nome_cidade , p.nome, c2.nome_cidade
from fornecedor f 
INNER JOIN cidade c on f.id_cidade = c.id 
INNER JOIN pessoa p on f.id_pessoa = p.id 
INNER JOIN cidade c2 on p.id_cidade = c2.id 

consegui retornar os dados do banco com a ajuda de vcs… porem agora eu tentei fazer isso

exemplo

jtxtField.setText(rs.getString(“c.nome_cidade”));

não consegui pois diz que coluna não foi encontrada no resultset… como faço para setar os dados do rs para os campo sendo que não posso utilizar apenas nome_cidade e tenho que informa sempre se é c.nome_cidade ou c2.nome_cidade… alguma ideia???

vlww

Olá Naruto,

Já tentou usar ‘aliases’ nos nomes dos campos ?
Exemplo:

PreparedStatement pstmt = conn.prepareStatement("SELECT f.nome as fnome, c.nome_cidade as ccidade, p.nome as pnome, c2.nome_cidade as c2cidade"
							+ " from fornecedor f "
							+ " INNER JOIN cidade c on f.id_cidade = c.id "
							+ "INNER JOIN pessoa p on f.id_pessoa = p.id "
							+ "INNER JOIN cidade c2 on p.id_cidade = c2.id ");
			
			ResultSet rs = pstmt.executeQuery();
			if (rs.next()) {
				System.out.println(rs.getString("fnome"));
				System.out.println(rs.getString("ccidade"));
				System.out.println(rs.getString("pnome"));
				System.out.println(rs.getString("c2cidade"));
						
			}

então tentei sim porem utilizando assim p.* AS p ao nçao deu certo peguei ao invez de informa o nome da coluna informei a posição
no getString(1) por exemplo.

Obrigado a todos :smiley: