none
update sql inner join RRS feed

  • Pergunta

  • Bom dia amigos,

    estou tentando fazer um update... dessa seguinte forma

    update PRODUTO
    set PRODUTO.GARANTIA = 3
    FROM PRODUTO
    inner join MOVIMENTO
    ON PRODUTO.ID = MOVIMENTO.ID_PRODUTO
    WHERE PRODUTO.ELIMINADO = 'N'

    mas está dando esse erro...  

    Total execution time: 0.000s
    Preparing query: update PRODUTO
    set PRODUTO.GARANTIA = 3
    inner join MOVIMENTO
    ON PRODUTO.ID = MOVIMENTO.ID_PRODUTO
    Error: *** IBPP::SQLException ***
    Context: Statement::Prepare( update PRODUTO
    set PRODUTO.GARANTIA = 3
    inner join MOVIMENTO
    ON PRODUTO.ID = MOVIMENTO.ID_PRODUTO )
    Message: isc_dsql_prepare failed

    SQL Message : -104
    Invalid token

    Engine Code    : 335544569
    Engine Message :
    Dynamic SQL Error
    SQL error code = -104
    Token unknown - line 3, column 1
    inner


    Total execution time: 0.187s

    por favor me ajudem.

    quarta-feira, 5 de outubro de 2016 15:11

Respostas

  • Boa tarde,

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

    Segue outra sugestão sem o Join para teste:

    update PRODUTO
    set GARANTIA = 3
    WHERE 
        PRODUTO.ELIMINADO = 'N' AND
        EXISTS 
            (SELECT 1 FROM MOVIMENTO
             WHERE MOVIMENTO.ID_PRODUTO = PRODUTO.ID)
    

    Espero que ajude


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

    quarta-feira, 5 de outubro de 2016 16:40

Todas as Respostas

  • Isso ocorre porque voce tem duas vezes a tabela produto na sua query. Uma é aqui "Update Produto" e a outra é aqui "FROM PRODUTO".  O inner join nao sabe qual é a tabela que ele deve usar. Sugiro voce fazer:

    update PRODUTO
    set PRODUTO.GARANTIA = 3
    FROM MOVIMENTO
    WHERE PRODUTO.ELIMINADO = 'N' and PRODUTO.ID = MOVIMENTO.ID_PRODUTO

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------


    quarta-feira, 5 de outubro de 2016 15:20
  • preciso da tabela movimento pelo seguinte motivo...

    os dados so devem ser atualizados se o resultado estiver em ambas tabelas...

    ex:  se na tabela produto tiver ( id1, id2, id3, id4) e na tabela movimento só tiver ( id3, id4) é pra atualizar os que estiverem nos dois ou seja ( id3, id4) 

    entendeu?

    quarta-feira, 5 de outubro de 2016 15:44
  • Faei besteira. Relamente o resultado nao é o mesmo, inclusive apaguei a ultima parte da minha resposta.

    O que voce quer fazer resolve-se com essa query:

    update PRODUTO
    set PRODUTO.GARANTIA = 3
    FROM MOVIMENTO
    WHERE PRODUTO.ELIMINADO = 'N' and PRODUTO.ID = MOVIMENTO.ID_PRODUTO

    A query acima so vai atualizar os produtos nao elininados (eliminado='N') e que tem uma correspondencia no movimento.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------


    quarta-feira, 5 de outubro de 2016 15:52
  • Boa tarde,

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

    Segue outra sugestão sem o Join para teste:

    update PRODUTO
    set GARANTIA = 3
    WHERE 
        PRODUTO.ELIMINADO = 'N' AND
        EXISTS 
            (SELECT 1 FROM MOVIMENTO
             WHERE MOVIMENTO.ID_PRODUTO = PRODUTO.ID)
    

    Espero que ajude


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

    quarta-feira, 5 de outubro de 2016 16:40
  • não deu certo...

    uso o firebird-gerenciado pelo flamerobin

    Preparing query: update PRODUTO
    set GARANTIA = 3
    WHERE 
        PRODUTO.ELIMINADO = 'N' AND
        EXISTS 
            (SELECT 1 FROM MOVIMENTO
             WHERE MOVIMENTO.ID_PRODUTO = PRODUTO.ID)
    Prepare time: 0.000s
    PLAN (MOVIMENTO INDEX (RDB$FOREIGN93))
    PLAN (PRODUTO NATURAL)


    Executing...
    Error: *** IBPP::SQLException ***
    Context: Statement::Execute( update PRODUTO
    set GARANTIA = 3
    WHERE 
        PRODUTO.ELIMINADO = 'N' AND
        EXISTS 
            (SELECT 1 FROM MOVIMENTO
             WHERE MOVIMENTO.ID_PRODUTO = PRODUTO.ID) )
    Message: isc_dsql_execute2 failed

    SQL Message : -913
    deadlock

    Engine Code    : 335544336
    Engine Message :
    deadlock
    update conflicts with concurrent update
    concurrent transaction number is 449504


    Total execution time: 0.031s

    quarta-feira, 5 de outubro de 2016 18:20
  • Acredito que você esteja tirando uma duvida de um erro que está acontecendo no seu gerenciador de bando de dados 

    firebird-gerenciado "flamerobin" em um fórum onde as respostas dadas são executadas no SQL SERVER, 

    o resposta que você recebeu o nosso amigo ,executa perfeitamente no SQL Server , acredito que o problema não esteja no seu Sql.

    onde sua query pede uma estrutura de banco (fiz bem simples)  

    CREATE TABLE Produto
    (
    GARANTIA INT,
    ELIMINADO VARCHAR(1),
    ID   INT
    )
    
    CREATE TABLE MOVIMENTO
    (
    	ID_PRODUTO	 INT,
    
    )
    UPDATE PRODUTO
    set PRODUTO.GARANTIA = 3
    FROM MOVIMENTO
    WHERE PRODUTO.ELIMINADO = 'N' and PRODUTO.ID = MOVIMENTO.ID_PRODUTO

    veja que se vc apenas copiar o trecho acima e rodar no SQL server funciona , a não ser que 

    1) o Campo PRODUTO.GARANTIA não seja do tipo int ou referente ,

    2) o Campo PRODUTO.GARANTIA não possa receber o valor 3 (exemplo disso são container criadas para o campo .

    fora esses dois pontos , acredito que seu problema não esteje na query executada


    Wesley Neves

    quarta-feira, 5 de outubro de 2016 18:49
  • Abrão, pela mensagem de erro o comando que sugeri funcionou, o problema é que houve um conflito com outro comando Update que estava sendo executado no mesmo momento.

    Acredito que esse erro não ocorreria se esse outro Update não estivesse sendo executado.

    Espero que ajude


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

    quarta-feira, 5 de outubro de 2016 18:53
  • DESCULPA AMIGO... REALMENTE DEU CERTO... 

    VLW MESMO...

    MUITO OBRIGADO...

    quarta-feira, 5 de outubro de 2016 19:09
  • O exists precisa de um campo valido no FireBird: http://www.janus-software.com/fbmanual/manual.php?book=psql&topic=85

    mas qual é o problema com essa query:

    update PRODUTO
    set PRODUTO.GARANTIA = 3
    FROM MOVIMENTO
    WHERE PRODUTO.ELIMINADO = 'N' and PRODUTO.ID = MOVIMENTO.ID_PRODUTO

    ?

    Ela deveria funcionar sem problemas.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quarta-feira, 5 de outubro de 2016 19:13
  • William, acredito que o Firebird (pelo menos até a versão 2.5) não aceita o From no comando Update:

    http://www.firebirdsql.org/refdocs/langrefupd25-update.html

    Abs


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

    quarta-feira, 5 de outubro de 2016 19:29
  • Pelo que eu sei, update com From é SQLANSI, mas pode ser que o FireBird nao respeite isso.

    Agora eu nao entendo por que ainda as pessoas usam FireBird.

    Att




    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quarta-feira, 5 de outubro de 2016 20:11