Como relacionar campos de InterBase
Olá a todos,
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
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
Curtidas 0
Respostas
Alexandrejose
13/01/2008
Você precisa fazer INNER JOIN com a tabela de usuários.
select A.*, B.Nome from Tabela A inner join TabelaUsuarios B on A.ID = B.ID;
Se foi o que eu entendi é isso.
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
Sérgio Gobbo
13/01/2008
Obrigado, é isso mesmo. Eu estou usando um IBDataSet no Delphi, só que não estou conseguindo utilizar essa instrução nele, você saberia como fazer ou em qual componente?
Obrigado
Obrigado
GOSTEI 0
Alexandrejose
13/01/2008
É nesse mesmo, ou no IBQuery, vc deve estar escrevendo algo errado.
Rode no IBExpert ou no IBConsole, se funcionar nele, funciona no componente.
Rode no IBExpert ou no IBConsole, se funcionar nele, funciona no componente.
GOSTEI 0
Sérgio Gobbo
13/01/2008
Então meu amigo, deu certo, só que dá um pequeno problema, os registros repetem 90 vezes cada um.
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
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
Aroldo Zanela
13/01/2008
Colega,
Teste o roteiro abaixo:
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
Sérgio Gobbo
13/01/2008
Obrigado pela ajuda Aroldo.
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
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
Aroldo Zanela
13/01/2008
Colega,
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)?
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
Sérgio Gobbo
13/01/2008
Bom, é assim:
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
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
Aroldo Zanela
13/01/2008
Colega,
Roteiro de criação das tabelas para quem quiser testar.
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
Sérgio Gobbo
13/01/2008
Funcionou perfeitamente!!
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
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
Aroldo Zanela
13/01/2008
Colega,
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.
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
Sérgio Gobbo
13/01/2008
Então, é que aquele select q vc postou anteriormente era pra relacionar as tabelas, ou seja, aparecer todos os registros na tela com os nomes de usuario e atleta e não apenas com o ID. Só que apartir destes registros, eu precisaria fazer um filtro, pelo nome por exemplo.
Ou seja, eu precisaria fazer um filtro em cima do resultado daquele select.
Obrigado
Ou seja, eu precisaria fazer um filtro em cima do resultado daquele select.
Obrigado
GOSTEI 0
Aroldo Zanela
13/01/2008
Colega,
Basta adicionar as retrições (where). Exemplo:
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
Sérgio Gobbo
13/01/2008
Obrigado Aroldo.
Está tudo ok.
Muito grato pela ajuda.
Está tudo ok.
Muito grato pela ajuda.
GOSTEI 0