MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração


Participe do fórum, é rápido e fácil

MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access

    [Resolvido]Excluir utilizando inner join

    avatar
    famomonteiro
    Novato
    Novato

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 4
    Registrado : 17/09/2013

    [Resolvido]Excluir utilizando inner join Empty [Resolvido]Excluir utilizando inner join

    Mensagem  famomonteiro 3/11/2014, 12:38

    Olá pessoal,

    Estou com o seguinte problema: Utilizo 2 tabelas, CAD2014 e CADGERAL. Quero excluir da tabela CADGERAL todos os registros que existem na tabela CAD2014. Utilizei no access uma consulta com inner join, onde consulgo ver todas as duplicatas e para deletar, utilizei o comando abaixo, mas dar erro: Não foi possível excluir itens das tabelas especificadas:
    DELETE CADGERAL.*
    FROM CAD2014 INNER JOIN CADGERAL ON (CAD2014.NOME=CADGERAL.NOME) AND (CAD2014.ENDERECO=CADGERAL.ENDERECO);

    Alguém teria uma solução?
    Alexandre Neves
    Alexandre Neves
    Moderador Global
    Moderador Global

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7971
    Registrado : 05/11/2009

    [Resolvido]Excluir utilizando inner join Empty Re: [Resolvido]Excluir utilizando inner join

    Mensagem  Alexandre Neves 3/11/2014, 20:30

    Boa noite,
    Não pode utilizar o DELETE com ligação de tabelas, terá de engenhar.
    DELETE * FROM CAD2014 WHERE NOME IN (SELECT NOME FROM CADGERAL) AND ENDERECO IN (SELECT ENDERECO FROM CADGERAL);


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo
    avatar
    famomonteiro
    Novato
    Novato

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 4
    Registrado : 17/09/2013

    [Resolvido]Excluir utilizando inner join Empty Re: [Resolvido]Excluir utilizando inner join

    Mensagem  famomonteiro 4/11/2014, 10:33

    Alexandre, obrigado pela disca. Não tinha pensado dessa maneira. Solução perfeita!
    avatar
    JocaV
    Novato
    Novato

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1
    Registrado : 27/05/2021

    [Resolvido]Excluir utilizando inner join Empty Re: [Resolvido]Excluir utilizando inner join

    Mensagem  JocaV 27/5/2021, 22:47

    Prezado Alexandre, não obstante tua boa intenção em ajudar, a tua solução proposta NÃO RESOLVE o problema, ok?
    Vejamos, supondo esta tabela CADGERAL:

    NOME ENDERECO
    Joca   10
    Ana   5
    Pedro 7
    Flavio 20
    Antonio 15
    Luiz   7
    Paulo 13
    Joca   8
    Henrique 10
    João   8

    ...e esta tabela CAD2014, com os dados a serem deletados:

    NOME ENDERECO
    Joca   8
    Ana   5
    Pedro 7
    Paulo 13
    Henrique 10

    Perceba que eu quero remover o "Joca 8" e o "Henrique 10". Porém, com essa solução proposta, o "Joca 10" será TAMBÉM excluído, porém erroneamente.
    Assim, essa tua solução "DELETE * FROM CAD2014 WHERE NOME IN (SELECT NOME FROM CADGERAL) AND ENDERECO IN (SELECT ENDERECO FROM CADGERAL)" pode até ter resolvido momentaneamente o problema do famomonteiro, mas, certamente, com tabelas maiores ele teria problema!

    A solução é, na realidade, muito parecida com a proposta do próprio famomonteiro, só ele errou na tentativa de traduzir para nosso idioma:
    DELETE CADGERAL.*
    FROM CAD2014 INNER JOIN CADGERAL ON (CAD2014.NOME=CADGERAL.NOME) AND (CAD2014.ENDERECO=CADGERAL.ENDERECO)
    Ele entendeu que assim, ele estaria deletando DO cadgeral A PARTIR DO cad2014.
    Para corrigir, basta inserir o DISTINCTROW após o SELECT para deixar os registros exclusivos.
    Fica assim:

    DELETE DISTINCTROW CADGERAL.*
    FROM CADGERAL INNER JOIN CAD2014 ON (CADGERAL.NOME = CAD2014.NOME) AND (CADGERAL.ENDERECO = CAD2014.ENDERECO)

    Essa sim, pode executar que funciona!!

      Data/hora atual: 23/6/2021, 06:25