comparação e seleção de informações em tabelas
03/12/2014
0
sou novo na área e estou tendo algumas dificuldades aqui.
Estou precisando selecionar as informações que contem em uma tabela e não contem na outra por exemplo :
na tabela "movdetalhe" contem uma coluna chamada idmovcaixa e idfilial.
em outra tabela chamada "movcaixa" contem as mesmas colunas.
porem preciso que as informações contidas nas duas colunas sejam iguais tipo se na movdetalhe a coluna tem idmovcaixa =15 e idfilial =1 na movcaixa deve também conter idmovcaixa= 15 e idfilial = 1.
o meu problema é que a tabela movdetalhe não contem todos os campos que existem na tabela movcaixa eu quero selecionar esses campos da movcaixa e deleta - los para que as duas tabelas fiquem iguais.
se alguém puder me ajudar fico muito grato.
desde já agradeço a ajuda de todos.
Vanilson
Post mais votado
10/12/2014
select * from movdetalhe where not exists (select * from movcaixa where movcaixa.idmovcaixa = movdetalhe.idmovcaixa and movcaixa.idfilial = movdetalhe.idfilial)
Verifique se a consulta deu certo. Se estiver ok é só trocar o "select * " por delete, assim:
delete from movdetalhe where not exists (select * from movcaixa where movcaixa.idmovcaixa = movdetalhe.idmovcaixa and movcaixa.idfilial = movdetalhe.idfilial)
Gisele Fagundes
Mais Posts
10/12/2014
Vanilson
Porém venho informar que não deu certo ainda, pois o script que você me passou selecionou apenas os itens contidos nas duas tabelas. Fiz algumas alterações que segue adiante:
select * from movcaixa where not exists (select * from movcaixadetalhe where movcaixadetalhe.idmovcaixa != movcaixa.idmovcaixa and movcaixadetalhe.idfilial = movcaixa.idfilial);
Obs.: essa ai é estrutura real das tabelas, a que eu havia passado na pergunta era apenas um exemplo.
tentei esse aqui também:
select * from movcaixadetalhe where not exists (select * from movcaixa where movcaixa.idmovcaixa != movcaixadetalhe.idmovcaixa and movcaixa.idfilial = movcaixadetalhe.idfilial);
mais este:
select movcaixa.idmovcaixa, movcaixa.idfilial
from movcaixa
left join movcaixadetalhe on movcaixadetalhe.idmovcaixa != movcaixa.idmovcaixa and movcaixadetalhe.idfilial != movcaixa.idfilial
where
movcaixadetalhe is null;
mais todos me trazem apenas as informações que constam nas duas tabelas.
eu preciso somente delecionar dos que constam na tabela movcaixadetalhe e não constam na movcaixa. Se você souber outra forma me informe pois na net aqui so encontro as mesmas coisas.
Desde já agradeço a colaboração. Obrigado.
10/12/2014
Gisele Fagundes
no comando mandamos o banco selecionar todos os registros de movdetalhe - select * from movcaixadetalhe - que é a tabela com os registro que você deseja certo?
Em seguida no where mandamos filtrar todos os itens que tenham nesta tabela mas que não tenha na tabela movcaixa um registro com o mesmo valor - where not exists (select * from movcaixa where movcaixa.idmovcaixa = movdetalhe.idmovcaixa and movcaixa.idfilial = movdetalhe.idfilial)
Conforme o que você passou o comando seria esse ai mesmo, uma outra forma que talvez fique mais fácil para você conferir é a seguinte:
select
movcaixadetalhe.idmovcaixa as 'ID MovDetalhe', movcaixa.idfilial as 'ID MovCaixa'
from movcaixadetalhe
left join movcaixa on (movcaixa.idmovcaixa = movcaixadetalhe.idmovcaixa and movcaixa.idfilial = movcaixadetalhe.idfilial)
where
movcaixa.idmovcaixa = '' or movcaixa.idmovcaixa is null
Você vai ver que só vai aparecer os itens do movcaixadetalhe que não tem correspondente no movcaixa
10/12/2014
Vanilson
Certo esse ultimo script que você me passou selecionou apenas o que constava em ambas as tabelas.
Clique aqui para fazer login e interagir na Comunidade :)