Comparar 2 Selects
Fala Galeraa, tenho uma duvida que está me atormentando aqui, vamos ver se vcs conseguem me ajudar.
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
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
Curtidas 0
Melhor post
Cleiflavio
19/08/2009
CAraaa deu certo era isso que eu precisava mesmo.
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
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
GOSTEI 1
Mais Respostas
Facc
19/08/2009
Como vc sabe se o usuário fez ou não o curso?
GOSTEI 0
Cleiflavio
19/08/2009
Com eu falei a T_controle vai controlar as notas do usuario.
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.
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
Cleiflavio
19/08/2009
Com eu falei a T_controle vai controlar as notas do usuario.
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.
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
Facc
19/08/2009
Tenta algo semelhante
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
Marcos Roberto
19/08/2009
Olá pessoal!!
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.
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
Marcos P
19/08/2009
Marcos,
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 ?
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
Marcos Roberto
19/08/2009
Olá Marcos.
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!!!
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
Marcos P
19/08/2009
Assumindo que a ligação entre as tabelas ocorre entre as colunas ( SOC_SOCIOS.COD = SOC_SOCIOS_IDENTIF.SOCIO_COD_ID ), faça :
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...
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
Marcos Roberto
19/08/2009
uoouuuuu!!!
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.
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
Marcos P
19/08/2009
Se você criou as chaves primárias e elas contém, em cada tabela, apenas os campos de ligação no relacionamento... um índice secundário é desnecessário, pois a própria chave-primária faz essa função.
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+
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
Marcos Roberto
19/08/2009
Olá Marcos!
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!!
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