Sergio990 0 Posted December 28, 2010 Report Share Posted December 28, 2010 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 Link to post Share on other sites
edgarzigne 0 Posted December 28, 2010 Report Share Posted December 28, 2010 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? Link to post Share on other sites
edgarzigne 0 Posted December 28, 2010 Report Share Posted December 28, 2010 http://www.devguru.com/technologies/t-sql/7114.asp Mais sobre Joins Link to post Share on other sites
Sergio990 0 Posted December 28, 2010 Author Report Share Posted December 28, 2010 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) Link to post Share on other sites
Sergio990 0 Posted December 28, 2010 Author Report Share Posted December 28, 2010 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 Link to post Share on other sites
edgarzigne 0 Posted December 28, 2010 Report Share Posted December 28, 2010 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 Link to post Share on other sites
edgarzigne 0 Posted December 28, 2010 Report Share Posted December 28, 2010 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 Link to post Share on other sites
Sergio990 0 Posted December 28, 2010 Author Report Share Posted December 28, 2010 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. Uploaded with ImageShack.us Link to post Share on other sites
edgarzigne 0 Posted December 28, 2010 Report Share Posted December 28, 2010 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 Link to post Share on other sites
Sergio990 0 Posted December 29, 2010 Author Report Share Posted December 29, 2010 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. 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" Link to post Share on other sites
edgarzigne 0 Posted December 29, 2010 Report Share Posted December 29, 2010 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 . 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 Link to post Share on other sites
Sergio990 0 Posted December 29, 2010 Author Report Share Posted December 29, 2010 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'. Link to post Share on other sites
Sergio990 0 Posted December 29, 2010 Author Report Share Posted December 29, 2010 Ok esquece a minha pergunta Ja funciona sim Desculpa a minha teimosia e falta de experiencia com o sql XD Muito OBRIGADO Link to post Share on other sites
edgarzigne 0 Posted December 29, 2010 Report Share Posted December 29, 2010 Nao tas a fazer perder tempo hihi. as vezes estas coisas são abstractas 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 Link to post Share on other sites
Sergio990 0 Posted December 29, 2010 Author Report Share Posted December 29, 2010 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 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 Link to post Share on other sites
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now