Fórum Como relacionar campos de InterBase #351803
13/01/2008
0
Tenho uma consulta, onde está gravado numa tabela o ID do usuário, que seria a chave primaria da tabela de usuarios. Bom, eu preciso pegar o nome desse usuários na tabela de usuários e exibi-lo na consulta.
Alguém sabe uma forma simples de se fazer isso?
Obrigado a todos,
Sérgio
Sérgio Gobbo
Curtir tópico
+ 0Posts
14/01/2008
Alexandrejose
select A.*, B.Nome from Tabela A inner join TabelaUsuarios B on A.ID = B.ID;
Se foi o que eu entendi é isso.
Gostei + 0
14/01/2008
Sérgio Gobbo
Obrigado
Gostei + 0
14/01/2008
Alexandrejose
Rode no IBExpert ou no IBConsole, se funcionar nele, funciona no componente.
Gostei + 0
15/01/2008
Sérgio Gobbo
Esse é o código:
SELECT TBOPERACOES.*, TBUSUARIOS.NOME, TBATLETAS.NOME FROM TBOPERACOES INNER JOIN TBUSUARIOS ON TBOPERACOES.ID_U =TBUSUARIOS.ID_U, TBOPERACOES INNER JOIN TBATLETAS ON TBOPERACOES.ID_A=TBATLETAS.ID_A ORDER BY ID_OP
é assim: essa tabela de operações tem o ID do Usuário e o ID do Atleta e na hora de exibir esses dados na consulta eu quero que venha com o nome do usuário e o nome do atleta que se encontram em suas respectivas tabelas. Então eu quero que,apartir do ID de cada um, eu consiga exibir seus nomes, relacionando as tabelas.
Na hora que carrego o formulário, tem um DBGrid que está ligado com o IBDataSet em que está o select, e ele exibi 90 vezes cada registro que tem na tabela. Porém, se eu fizer só um INNER JOIN com Usuários ou Atletas, aí funciona e aparece normalmente os registros.
Teria alguma maneira de fazer um relacionamento de uma tabela com duas outras sem acontecer isso?
Obrigado,
Sérgio
Gostei + 0
16/01/2008
Aroldo Zanela
Teste o roteiro abaixo:
SELECT TBOPERACOES.*, TBUSUARIOS.NOME, TBATLETAS.NOME FROM TBOPERACOES INNER JOIN TBUSUARIOS ON TBOPERACOES.ID_U = TBUSUARIOS.ID_U INNER JOIN TBATLETAS ON TBOPERACOES.ID_A =TBATLETAS.ID_A ORDER BY ID_OP
Gostei + 0
16/01/2008
Sérgio Gobbo
Realmente não duplicou os registros, porém, ele só pega os registros q que possuem um ID de usuário e um ID de Atleta, que nem sempre existirá.
É assim: essa tabela de operações registra tudo que o Usuário faz no sistema, ou seja, se ele insere, edita ou exclui um atleta do sistema, será reistrado o ID desse usuário e o ID do atleta que estava envolvido na operação. Porém, se o Usuário efetua login ou logoff no sistema, também será registrado, só que o campo ID_A (ID do atleta) estará em branco, pois não terá nenhum atleta envolvido.
Quando faço aquele SELECT, são pegos todos os registros que tem ID_A, ou seja, inserções, edições ou exclusões, porém os de login e logoff não são pegos pelo SELECT. Há alguma forma de pegar todos os registros d tabela de operações, relacionar com TBUSUÁRIOS, para exibir o nme do usuário e relacionar os que tem ID_A com TBATLETAS para exibir o nome do atleta, quando houver?
Obrigado novamente pela ajuda,
Sérgio
Gostei + 0
16/01/2008
Aroldo Zanela
Left ou Right Outer Join dependendo do caso. Tem como colocar a estrutura básica das tabelas (chaves primárias e chaves estrangeiras das associações)?
Gostei + 0
16/01/2008
Sérgio Gobbo
TBAtletas
ID_A int chave primaria
Nome varchar
(todos os outros campos varchar)
TBUsuarios
ID_U int chave primaria
Nome varchar
(todos os outros campos varchar)
TBOperacoes
ID_OP int chave primaria
ID_U int seria a chave estrangeira de TBUsuarios
ID_A int seria a chave estrangeira de TBAtletas
Operacao varchar (a operação realizada: inserção, edição, etc)
data date
hora time
OBS varchar
é isso aí meu amigo, mas eu sou inciante com sql, então num sei direito trabalhar com outer join.... o inner join meio q aprendi com oq vc postou anteriormente.. hehe
se vc pudesse me explicar agradeceria!
Obrigado pela ajuda,
Sérgio
Gostei + 0
16/01/2008
Aroldo Zanela
SELECT TBOPERACOES.*, tbusuarios.nome USUARIO, tbatletas.nome ATLETA FROM TBOPERACOES left join tbusuarios on (tboperacoes.id_u=tbusuarios.id_u) left join tbatletas on (tboperacoes.id_a=tbatletas.id_a)
Roteiro de criação das tabelas para quem quiser testar.
/*==============================================================*/ /* Table: TBATLETAS */ /*==============================================================*/ create table TBATLETAS ( ID_A INTEGER not null, NOME VARCHAR(60), constraint PK_TBATLETAS primary key (ID_A) ); /*==============================================================*/ /* Table: TBOPERACOES */ /*==============================================================*/ create table TBOPERACOES ( ID_OP INTEGER not null, ID_U INTEGER, ID_A INTEGER, OPERACAO VARCHAR(20), DATA DATE, HORA DATE, OBS VARCHAR(100), constraint PK_TBOPERACOES primary key (ID_OP) ); /*==============================================================*/ /* Table: TBUSUARIOS */ /*==============================================================*/ create table TBUSUARIOS ( ID_U INTEGER not null, NOME VARCHAR(60), constraint PK_TBUSUARIOS primary key (ID_U) ); alter table TBOPERACOES add constraint FK_TBOPERAC_RELATIONS_TBUSUARI foreign key (ID_U) references TBUSUARIOS (ID_U); alter table TBOPERACOES add constraint FK_TBOPERAC_RELATIONS_TBATLETA foreign key (ID_A) references TBATLETAS (ID_A);
Gostei + 0
16/01/2008
Sérgio Gobbo
Aroldo, obrigado pela sua ajuda, acho q já estou melhorando com SQL graças a vc.. hehe
Amigo, vou te perguntar mais uma coisa, é a última.. hehe
Depois que testei oq vc postou, comecei a fazer um filtro daquele select. Por exemplo, esse select é executado ao abrir o formulário de consulta. Sò que no formulário, o usuário tem a opção de filtrar pelo nome do usuário, pelo nome do atleta, pelo tipo de operação ou pela data.
Por exemplo, o formulário é aberto, vão ter milhares de registros no DBGrid, maseu só quero ver os registros de Login de um usuário que se chama Carlos, por exemplo.
Tentei colocar um where ao fim do codigo mas num deu certo. Tentei também fazer uma subconsulta, mas dava erro na forma como eu colocava o código. Você saberia alguma boa técnica pra isso?
Agradeço novamente,
Sérgio
Gostei + 0
17/01/2008
Aroldo Zanela
Eu costumo ´entrar´ no formulário com a consulta (query) fechada e aguardar que o usuário defina os critérios (constraints) de seleção. Desta forma, o formulário é carregado rapidamente em memória e o usuário tem a disposição os critérios de filtragem e num clique de um botão ele pode submeter a consulta ou desistir da tarefa naquele momento.
Gostei + 0
17/01/2008
Sérgio Gobbo
Ou seja, eu precisaria fazer um filtro em cima do resultado daquele select.
Obrigado
Gostei + 0
17/01/2008
Aroldo Zanela
Basta adicionar as retrições (where). Exemplo:
select tboperacoes.*, tbusuarios.nome USUARIO, tbatletas.nome ATLETA from tboperacoes left join tbusuarios on (tboperacoes.id_u=tbusuarios.id_u) left join tbatletas on (tboperacoes.id_a=tbatletas.id_a) where tbatletas.nome = ´AROLDO ZANELA´
Gostei + 0
18/01/2008
Sérgio Gobbo
Está tudo ok.
Muito grato pela ajuda.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)