Fórum Como relacionar campos de InterBase #351803

13/01/2008

0

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


Sérgio Gobbo

Sérgio Gobbo

Responder

Posts

14/01/2008

Alexandrejose

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.


Responder

Gostei + 0

14/01/2008

Sérgio Gobbo

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


Responder

Gostei + 0

14/01/2008

Alexandrejose

É nesse mesmo, ou no IBQuery, vc deve estar escrevendo algo errado.
Rode no IBExpert ou no IBConsole, se funcionar nele, funciona no componente.


Responder

Gostei + 0

15/01/2008

Sérgio Gobbo

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


Responder

Gostei + 0

16/01/2008

Aroldo Zanela

Colega,

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



Responder

Gostei + 0

16/01/2008

Sérgio Gobbo

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


Responder

Gostei + 0

16/01/2008

Aroldo Zanela

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)?


Responder

Gostei + 0

16/01/2008

Sérgio Gobbo

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


Responder

Gostei + 0

16/01/2008

Aroldo Zanela

Colega,

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);




Responder

Gostei + 0

16/01/2008

Sérgio Gobbo

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


Responder

Gostei + 0

17/01/2008

Aroldo Zanela

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.


Responder

Gostei + 0

17/01/2008

Sérgio Gobbo

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


Responder

Gostei + 0

17/01/2008

Aroldo Zanela

Colega,

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´



Responder

Gostei + 0

18/01/2008

Sérgio Gobbo

Obrigado Aroldo.

Está tudo ok.

Muito grato pela ajuda.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar