none
Update em consulta SQL RRS feed

  • Pergunta

  • Bom dia,

    Abaixo a qual está funcionando perfeitamente.

    SELECT Nr_Ordem, Nome, CPF, Data_Nascimento, Sexo, Tipo_Sanguineo, Cadastrado_em, Alterado_por FROM Ferias  WHERE  cpf IN(SELECT cpf FROM Ferias GROUP BY cpf HAVING COUNT(*) > 1) order by cpf, Nr_Ordem

    porém quando tendo atualizar um campo utilizando o Update, dá erro e não funciona, a única coisa que foi acrescentado ao Select acima que funciona é a pasrte em Negrito.  Alguém teria uma sugestão ?

    UPDATE Ferias SET Ficha_Duplicada = 'S' WHERE cpf IN (SELECT Nr_Ordem, Nome, CPF, Data_Nascimento, Sexo, Tipo_Sanguineo, Cadastrado_em, Alterado_por FROM Ferias  WHERE  cpf IN(SELECT cpf FROM Ferias GROUP BY cpf HAVING COUNT(*) > 1) order by cpf, Nr_Ordem

    Ferias é o nome da Tabela e o campo a ser atualizado com a letra S é o campo Ficha_Duplicada

    quarta-feira, 9 de outubro de 2019 12:21

Respostas

  • Não tenho nenhuma experiência com o VB, mas verifique se esse método que você está utilizando (OpenRecordset) pode ser utilizado para executar um Update. É comum que o método utilizado para consultas seja diferente do método utilizado com comandos que não retornam dados como por exemplo o Insert, Update, Delete e etc.

    Voltando ao comando, imagino que você tenha testado dentro do Access esse comando que você postou acima. Mesmo que tenha funcionado, sugiro que você teste e tente implementar o comando que sugeri anteriormente, pois me parece que esse que você postou tem alguns trechos que me parecem desnecessários e que podem provocar erro.

     


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta IgorFKModerator quinta-feira, 10 de outubro de 2019 14:14
    quarta-feira, 9 de outubro de 2019 20:01

Todas as Respostas

  • Bom dia,

    Experimente fazer uns testes dessa forma para ver se é obtido o resultado esperado:

    with CTE_Count as
    (
        select
            *,
            count(1) over(partition by CPF) as QtdFerias
        from Ferias
    ) 
    
    update CTE_Count
    set Ficha_Duplicada = 'S' 
    where QtdFerias > 1
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 9 de outubro de 2019 12:27
  • nao deu certo nao.
    quarta-feira, 9 de outubro de 2019 13:04
  • Se o seu comando inicial retorna o que necessita, eis uma simplificação dele:

    -- código #1
    UPDATE Ferias 
      set Ficha_Duplicada = 'S' 
      where  CPF in (SELECT CPF from Ferias 
                     where CPF in (SELECT CPF 
                                     from Ferias 
                                     group by CPF 
                                     having count(*) > 1));
     

    Mas é um código SQL bem estranho, por causa da redundância nos filtros.

    Qual é a regra para atualizar a coluna Ficha_Duplicada? Isto é, em quais condições ela deve ser atualizada.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz quarta-feira, 9 de outubro de 2019 13:18
    quarta-feira, 9 de outubro de 2019 13:12
  • nao deu certo nao.

    O que ocorreu? Foi exibida alguma mensagem de erro? Se foi, qual?

    Qual versão do SQL Server você está utilizando?


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 9 de outubro de 2019 13:20
  • Marcar o campo ficha_duplicada apenas nos registros que estão em duplicidade, ou seja dois ou mais cpf repetidos.

    A idéia é a seguinte, marcar o campo ficha_duplicada com 'S',  em todas os registros da tabela FERIAS os quais tem CPF repetidos.

    Eu tenho uma Tabela FERIAS com 5 mil registros, porém nela tem uns 800 cadastrados com CPF repetido, tipo uma mesma pessoa cadastrada 2 ou mais vezes.

    Na verdade é uma instrução SQL, dentro do VB6, que atualiza um bco dados Access.

    No script abaixo dá o erro de que eu deveria usar a palavra reservada EXISTS na clausula FROM da consulta principal.

    A consulta em si, ou seja do primeiro Select em diante, funciona perfeitamente. a parte em negrito que está causando o erro. Se eu retirar a parte em negrito, a consulta fica perfeita, ela traz todos os registro com CPF duplicado.

    UPDATE Ferias
    SET Ficha_Duplicada = 'S' 
    WHERE CPF IN (SELECT Nr_Ordem, 
                 Nome, 
                 CPF, 
                 Data_Nascimento, 
                 Sexo, 
                 Tipo_Sanguineo, 
                 Cadastrado_em, 
                 Alterado_por 
           FROM Ferias
           WHERE cpf IN(SELECT cpf
                        FROM Ferias
                        GROUP BY cpf
                        HAVING COUNT(*) > 1)
                        order by cpf, 
                                 Nr_Ordem) 


    • Editado EmersonLEC quarta-feira, 9 de outubro de 2019 14:18
    quarta-feira, 9 de outubro de 2019 14:10
  • Na verdade é uma instrução SQL, dentro do VB6, que atualiza um bco dados Access.

    No script abaixo dá o erro de que eu deveria usar a palavra reservada EXISTS na clausula FROM da consulta principal.

    quarta-feira, 9 de outubro de 2019 14:17
  • Não tenho nenhuma experiência com o Access mas segue uma sugetão para testes:

    UPDATE Ferias
    INNER JOIN
    (
        SELECT cpf FROM Ferias GROUP BY cpf HAVING COUNT(*) > 1
    ) c
        ON c.cpf = Ferias.cpf
    SET Ficha_Duplicada = 'S' 

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 9 de outubro de 2019 14:29
  • Bom dia EmersonLEC,

    Realmente sua instrução SELECT aparentemene funciona, mas tem algumas melhorias para fazer, apenas  query  mais interna já é suficiente nesse caso, e quando se usa o operador IN, a subconsulta deve ter apenas um campo que no seu caso é o CPF.

    Outra coisa quando se usa uma subconsulta, a cláusula order by não é necessária.

    Acredito que com o código abaixo irá funcionar:

    UPDATE Ferias
    SET Ficha_Duplicada = 'S' 
    WHERE CPF IN (
    	SELECT
    		cpf
    	FROM Ferias
    	GROUP BY cpf
    	HAVING COUNT(*) > 1
    )
    

    Espero ter ajudado

    quarta-feira, 9 de outubro de 2019 14:51
  • GAPIMEX,

    Dentro do Access funcionou perfeitamente, resolveu em parte o problema.  Dentro do VB que não deu certo.  mas assim mesmo desde já agradeço muito a ajuda.   Vou continuar tentando dentro do VB 6.        

    ' esta linha abaixo  funciona no Access, mas nao dentro do VB,  conforme suas orientações.

    na linha abaixo eu movo toda consulta com o update pra uma variavel chamada  CONSULTA_SQL

    CONSULTA_SQL = "Update Ferias INNER JOIN (SELECT Nr_Ordem, Nome, CPF, Data_Nascimento, Sexo, Tipo_Sanguineo, Cadastrado_em, Alterado_por From Ferias WHERE cpf IN(SELECT cpf From Ferias GROUP BY cpf HAVING COUNT(*) > 1) order by cpf, Nr_Ordem) C ON  C.CPF = Ferias.cpf SET Ficha_Duplicada = 'S' "


        Set DB = DBEngine.Workspaces(0).OpenDatabase(unidade & ":\RH_Fichas\Ficha.mdb")
        Set RST = DB.OpenRecordset(CONSULTA_SQL)

    Meu muito obrigado aos amigos pela colaboração, vou continuar tentando dentro do VB6.
    • Editado EmersonLEC quarta-feira, 9 de outubro de 2019 17:52
    quarta-feira, 9 de outubro de 2019 15:12
  • Não tenho nenhuma experiência com o VB, mas verifique se esse método que você está utilizando (OpenRecordset) pode ser utilizado para executar um Update. É comum que o método utilizado para consultas seja diferente do método utilizado com comandos que não retornam dados como por exemplo o Insert, Update, Delete e etc.

    Voltando ao comando, imagino que você tenha testado dentro do Access esse comando que você postou acima. Mesmo que tenha funcionado, sugiro que você teste e tente implementar o comando que sugeri anteriormente, pois me parece que esse que você postou tem alguns trechos que me parecem desnecessários e que podem provocar erro.

     


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta IgorFKModerator quinta-feira, 10 de outubro de 2019 14:14
    quarta-feira, 9 de outubro de 2019 20:01
  • Acho que é por ai mesmo.  Obrigado pela ajuda.
    quarta-feira, 9 de outubro de 2019 20:48