Fórum Comparar 2 Selects #373785
19/08/2009
0
eu tenho duas tabelas T_controle e a T_treinamento.
essa tabela T_controle controla as notas de alguns testes que os usuarios fazem no sistema e a Tabela T_Treinamento é minha tabela onde contem todos os treinamentos para os usuario.
Eu preciso fazer com que mostre os treinamentos que os usuario ainda não fizereram, então na minha t_controle é cadastrado o ID, COD_treinamento, e a sua NOTA.
eu faço um select na minha t_treinamento mostrando os treinamentos que o usuario tem que fazer atraves do setor
SELECT 1
select cod_treinamento, treinamento, setor_treinamento from t_treinamento where setor_treinamento = ´TI´
ai esse select me mostra todos os treinamentos que o usuario precisa fazer.
ai eu tenho um outro select que me mostra os treinamentos que o usuario já fez
SELECT 2
select t_controle.status, t_usuario.id, t_controle.cod_treinamento, t_treinamento.treinamento, t_treinamento.setor_treinamento
from t_treinamento, t_controle , t_usuario where t_controle.cod_treinamento = t_treinamento.cod_treinamento
and t_controle.id_usuario = t_usuario.id
and id_usuario = ´1´
Eu queria comparar os dois selects e me mostrasse todos os treinamentos que o usuario ainda não fez tipo o resultado do SELECT 1 tudo que for diferente do SELECT 2 ele me mostra
Será que tem como ??
eu estou usando Firebird 2.0 e Delphi 07
Cleiflavio
Curtir tópico
+ 0Post mais votado
19/08/2009
Select cod_treinamento, treinamento, setor_treinamento from t_treinamento
where cod_treinamento not in (select cod_treinamento from t_controle where id_usuario = ´4´ )
and t_treinamento.setor_treinamento = ´TI´
Acertei o select assim e trouxe certinho oq eu precisava.
Valeuuu me ajudou pakasssss
Obrigado
Cleiflavio
Gostei + 1
Mais Posts
19/08/2009
Facc
Gostei + 0
19/08/2009
Cleiflavio
T_controle : controle, id_usuario, cod_treinamento, nota, data_treinamento e status .
Se eu tiver um usuario cadastrado na t_controle com a nota 10 do treinamento 2 quer dizer que ele já fez o treinamento 2 ,
Entendeu ?
Desse jeito vou saber se o usuario já fez o treinamento ou não.
Gostei + 0
19/08/2009
Cleiflavio
T_controle : controle, id_usuario, cod_treinamento, nota, data_treinamento e status .
Se eu tiver um usuario cadastrado na t_controle com a nota 10 do treinamento 2 quer dizer que ele já fez o treinamento 2 ,
Entendeu ?
Desse jeito vou saber se o usuario já fez o treinamento ou não.
Gostei + 0
19/08/2009
Facc
Select cod_treinamento, treinamento, setor_treinamento from t_treinamento where cod_treinamento not in (select cod_treinamento from t_controle where id_usuario = :piduser)
Gostei + 0
11/09/2014
Marcos Roberto
Eu uso o firebird 2.5 e estou com precisando fazer uma pesquisa mais ou mesmo parececida com a dica a cima, porem quando executo a select ele trava, e quando retorna o resultado fica muito lento navegar pelos registros. Já tentei fazer pelo delphi, pelo IBexpert e flamerobin, e o comportamento é mesmo!!
Segue a select:
select COD, RI, NOME FROM SOC_SOCIOS where COD in (Select SOCIO_COD_ID FROM SOC_SOCIOS_IDENTIF where IDENTIFICADOR = '3')
Agradeço.
Gostei + 0
11/09/2014
Marcos P
Quantos registros em cada tabela ?
Quantos registros devem ser selecionados pela query acima ?
Qual estrutura de chave primária em cada tabela ?
Qual a estrutura de índices em cada tabela ?
A consulta é lenta também quando realizada diretamente no servidor ?
Você tentou alterar o esquema acima para INNER JOIN ? Houve alteração de performance ?
Gostei + 0
11/09/2014
Marcos Roberto
a tabela SOCIO_COD_ID tem 77426 registros, e a SOC_SOCIOS tem 13751.
a tabela SOCIO_COD_ID contem 4841 registro com IDENTIFICADOR igual a 3, agora quantos registro deve me trazer da tabela SOC_SOCIOS eu não sei te dizer.
minhas tabelas não tem chaves primarias nem índices! Dá algum problema não ter???
Sim fica lento no servidor.
Eu não sei fazer com INNER JOIN , poderia me ajudar??
Agradeço viu Marcos!!!
Gostei + 0
11/09/2014
Marcos P
SELECT SOC.COD, SOC.RI, SOC.NOME
FROM SOC_SOCIOS SOC INNER JOIN SOC_SOCIOS_IDENTIF IDE ON ( SOC.COD = IDE.SOCIO_COD_ID)
WHERE IDE.IDENTIFICADOR = '3'
Se as chaves não forem essas, ajuste-as na clausula "ON" do "INNER JOIN".
Provavelmente, se ocorrer alguma diferença de performance, será mínima...
Procure criar as chaves primárias corretas nas tabelas... isso irá melhorar sua pesquisa !
Senão ficar 100%, crie um índice auxiliar na tabela SOC_SOCIOS_IDENTIF com a chave de ligação com SOC_SOCIOS.
Sem uma correta estrutura de chaves primárias e índices é impossível garantir performance nesse tipo de consulta...
Gostei + 0
11/09/2014
Marcos Roberto
deu certo Marcos, cara muito obrigado!!
Aproveitando a oportunidade, você disse se não ficar 100% pra eu criar um índice auxiliar nas tabelas. Como eu faria isso??
Mais uma vez obrigadão pela ajuda.
Gostei + 0
12/09/2014
Marcos P
Se suas chaves primárias incluem outras colunas, o índice secundário pode ajudar !
"Índices" é um assunto bem complexo e extenso... dê uma pesquisada aqui mesmo no DevMedia ou na WEB !
Alguns links que podem lhe ajudar :
> https://www.devmedia.com.br/curso-online-firebird-cap-8-criando-indices-com-ibexpert/4861
> http://www.youtube.com/watch?v=wOMj3kacTFI
> http://www.delphibr.com.br/artigos/art-ahr1.htm
T+
Gostei + 0
15/09/2014
Marcos Roberto
obrigado por me indicador alguns materiais.
Eu criei a chave estrangeira e a select que estava com lentidão foi beleza agora!
Aprendi muito com vc , mais uma vez obrigado!!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)