Jump to content
Sergio990

GridView Apresentar nomes =! vindo de 1 chave primaria para2coluna[RESOLVIDO]

Recommended Posts

Sergio990

Eu tenho 2 tabelas uma cabos e outra portas a tabela cabos tem:

idCabo

idPortaOrigem

idPortaDestino

nome

a de portas tem:

idPorta

nomePorta

o que eu queria era num select conseguir dizer que o cabo 2 sai da porta 1 e liga a porta 2.

mas nao estou a conseguir faze-lo devido na tabela portas nao ter idPortasDestino ou de origem ou seja o idPortas esta a funcionar para as duas maneiras.

O meu codigo que estava a tentar colocar era:

SELECT cabos.idCabo, cabos.idPortaOrigem, cabos.idPortaDestino, cabos.nome,portas.idporta,portas.nomePorta
FROM cabos,portas
Where cabos.idPortaOrigem=portas.idporta and cabos.idPortaDestino=portas.idp
ORDER BY nome" 

Eu sei que esse select nao esta bem feito para o que eu pretendo e na gridView o codigo seria algo do genero:

<asp:BoundField DataField="nomePortaOrigem" HeaderText="nomePortaOrigem" SortExpression="nomePortaOrigem" />
<asp:BoundField DataField="nomePortaDestino" HeaderText="nomePortaDestino" SortExpression="nomePortaDestino" />
<asp:BoundField DataField="nome" HeaderText="nome" SortExpression="nome" /> 

Ou seja deveria ser algo do tipo:

select nomeporta nomeportaOrigem,idPortaOrigem

From porta,cabos

where idPortaOrigem=idPorta

So que com esse select so ia conseguir colocar o nome da porta de origem

Se alguem me poder ajudar agradecia imenso ;)

Share this post


Link to post
Share on other sites
edgarzigne

SELECT PO.nomePorta NomePortaOrigem,PD.NomePorta NomePortaDestino
FROM Cabos C
INNER JOIN Portas PO ON PO.idPorta = C.idPortaOrigem
INNER JOIN Portas PD ON PD.idPorta = C.idPortaDestino

Se compreendi bem?

Share this post


Link to post
Share on other sites
Sergio990

SELECT PO.nomePorta NomePortaOrigem,PD.NomePorta NomePortaDestino
FROM Cabos C
INNER JOIN Portas PO ON PO.idPorta = C.idPortaOrigem
INNER JOIN Portas PD ON PD.idPorta = C.idPortaDestino

Se compreendi bem?

penso que nao eu tambem posso nao conseguir explicar bem o meu problema.

pelo que eu entendi do codigo estas a colocar ja uma porta de origem e uma de destino e eu so tenho uma unica porta (A)

Ou seja eu tenho 1 cabo que liga vai do (na tabela portas)  idPorta= 1 ao idporta=2 ou seja na tabela cabos vai ser idPortaorigem=1 e o idPortaDestino=2  o que eu queria era agora que ele ligasse o idPortaOrigem ao idPortas e me desse o nome da porta e o mesmo para o destino (A)

Share this post


Link to post
Share on other sites
Sergio990

bastava so ligar estes 2 selects que ja deveria faazer o que eu quero:

select nomeporta nomeportaOrigem,idPortaOrigem

From porta,cabos

where idPortaOrigem=idPorta

select nomeporta nomePortaDestino,idPortaDestino

From porta,cabos

where idPortaDestino=idPorta

Penso eu XD

Share this post


Link to post
Share on other sites
edgarzigne

Caro Sérgio por favor utiliza virgulas no teu texto ;)

Com o código que utilizei, iria a cada registo da tabela cabos dizer quais eram as portas de origem e de destino.

Poderás utilizar a clausula where para pesquisas:

SELECT PO.nomePorta NomePortaOrigem,PD.NomePorta NomePortaDestino
FROM Cabos C
INNER JOIN Portas PO ON PO.idPorta = C.idPortaOrigem
INNER JOIN Portas PD ON PD.idPorta = C.idPortaDestino
WHERE C.idPortaOrigem = @IdPortaPesquisa

Share this post


Link to post
Share on other sites
edgarzigne

Se para uma porta quiseres, por exemplo, saber todos os cabos em que a porta está presente. Independentemente de ser na origem ou no destino:

SELECT PO.nomePorta NomePortaOrigem,PD.NomePorta NomePortaDestino
FROM Cabos C
INNER JOIN Portas PO ON PO.idPorta = C.idPortaOrigem
INNER JOIN Portas PD ON PD.idPorta = C.idPortaDestino
WHERE C.idPortaOrigem = @IdPortaPesquisa OR C.idPortaDestino=@IdPortaPesquisa 

Share this post


Link to post
Share on other sites
Sergio990

Desculpa nao colocar virgulas.

Eu acho que nao é bem isso que eu quero (A)

Esta ai uma imagem do diagrama.

Ou seja so tenho um idPortas, para 2 campos de portas nos cabos.

semttulofz.jpg

Uploaded with ImageShack.us

Share this post


Link to post
Share on other sites
edgarzigne

Então penso que compreendi bem Sérgio e a query está bem feita.

Obrigado pelo diagrama:)

Sérgio, segundo a minha experiencia, o melhor é me fazeres uma pergunta do tipo:

Para a porta com o id=13 quais são as portas de destino?

R:

DECLARE @IdPortaPesquisa AS INT SET @IdPortaPesquisa = 13
SELECT PD.IdPorta IdPortaDestino,PD.NomePorta NomePortaDestino
FROM Cabos C
INNER JOIN Portas PO ON PO.idPorta = C.idPortaOrigem
INNER JOIN Portas PD ON PD.idPorta = C.idPortaDestino
WHERE C.idPortaOrigem = @IdPortaPesquisa

Para os cabos com o id superior a 10 e inferior a 20 quais são as portas de origem e de destino?

R:

DECLARE @idCaboMin AS INT SET @idCaboMin = 10
DECLARE @idCaboMax AS INT SET @idCaboMax = 20
SELECT PO.nomePorta NomePortaOrigem,PD.NomePorta NomePortaDestino
FROM Cabos C
INNER JOIN Portas PO ON PO.idPorta = C.idPortaOrigem
INNER JOIN Portas PD ON PD.idPorta = C.idPortaDestino
WHERE C.idCabo=> @idCaboMin AND C.IdCabo<=@idCaboMax

Para a porta com o id=13 é uma porta de destino para que portas de origem?

R:

DECLARE @IdPortaPesquisa AS INT SET @IdPortaPesquisa = 13
SELECT PO.IdPorta IdPortaOrigem,PO.nomePorta NomePortaOrigem
FROM Cabos C
INNER JOIN Portas PO ON PO.idPorta = C.idPortaOrigem
INNER JOIN Portas PD ON PD.idPorta = C.idPortaDestino
WHERE C.IdPortaDestino = @IdPortaPesquisa

Share this post


Link to post
Share on other sites
Sergio990

Eu ainda não percebi bem o teu código.

Porque eu quero seleccionar tudo.

Por exemplo se fosse a mostrar pelo idDestino e idOrigem era fácil só que eu queria era o nome das respectivas portas.

Ou seja, nessa tabela que eu coloquei, é o que eu consigo ver, onde diz idPortaOrigem e idPortaDestino queria ver o nome da porta em vez do id.

semttulofaj.jpg

o codigo que utilizei foi:

SELECT idCabo, idPortaOrigem, idPortaDestino, nome
FROM cabos c
Inner Join portas p ON p.idPorta=c.idPortaOrigem
ORDER BY nome" 

Share this post


Link to post
Share on other sites
edgarzigne

Terás que fazer 2 joins à tabela Portas como ja te tinha dito.

Ou seja o select fica:

SELECT idCabo, idPortaOrigem, idPortaDestino, PO.nome NomePortaOrigem,PD.Nome NomePortaDestino
FROM cabos c
Inner Join portas PO ON PO .idPorta=c.idPortaOrigem
Inner Join portas PD ON PD.idPorta=c.idPortaDestino
ORDER BY nome

Tas a ver que fiz 2 joins à tabela Portas, um com o alias PD (Porta Destino) e o outro com o alias PO (Porta Destino)

Este é um problema de SQL, o caro Sérgio terá que reforçar o seu conhecimento :D .

Eu posso fazer joins à mesma tabela infinitamente(...) para o que precisar.

Por exemplo tenho uma tabela Colaboradores composta por

IdColaborador (int, chave)

Nome

IdColaboradorSupervisor (int, chave externa ligada a esta tabela à mesma)

Rank(int, diz nos em que nivel se encontra o colaborador)

Pergunta: Quero uma listagem de todos os colaboradores, seus supervisores e dos supervisores dos supervisores

SELECT CC.Rank, CC.Nome NomeColaborador ,CS.Nome NomeSupervisor, CSS.Nome NomeDoSupervisorDoSupervisor
FROM Colaboradores CC
INNER JOIN Colaboradores CS ON CC.IdColaboradorSupervisor = CS.IdColaborador 
INNER JOIN Colaboradores CSS ON CS.IdColaboradorSupervisor = CSS.IdColaborador

Existe outra forma de fazer melhor mas por agora esta é bastante explicativa

Share this post


Link to post
Share on other sites
Sergio990

Desculpa la o tempo que estou a fazer-te perder XD

Mas, porque que no inicio do select colocas PO e PD?

Porque o sql nao reconhece o campo nome e Nome que estao no select como PO.nome e PD.Nome

Erro:

Invalid column name 'nome'.

Invalid column name 'Nome'.

Share this post


Link to post
Share on other sites
Sergio990

Ok esquece a minha pergunta :D

Ja funciona sim :)

Desculpa a minha teimosia e falta de experiencia com o sql XD

Muito OBRIGADO :D

Share this post


Link to post
Share on other sites
edgarzigne

Nao tas a fazer perder tempo hihi. as vezes estas coisas são abstractas :D

Ponho o PO e o PD porque são alias, é como se duas tabelas diferentes se tratassem. Não entendo esses erros pois a query esta bem feita acho eu:D

ainda bem que se resolveu, abraço:D

Share this post


Link to post
Share on other sites
Sergio990

Pois eu nao percebia era como ele selecionava o PO e o PD sem elas estarem na tabela do From XD

Mas agora ja percebi :D

Nao estava a dar porque era nomeporta em vez de so nome mas sim a query esta a funcionar 110% ;D

Muito bom e desculpa mais uma vez alguma coisa :)

Obrigado XD

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.