locked
Update em uma tabela utilizando filtros de outra RRS feed

  • Pergunta

  • Bom dia pessoal!

    Sou leigo com relação ao SQL, mas estou iniciando alguns trabalhos e surgiu uma dúvida...

    Tenho que fazer um update em uma tabela (TABELA1), porém para realizar este update quero fazer um filtro por data, mas este campo não existe nesta tabela. Tenho uma segunda tabela (TABELA2), que possui pontos de relacionamento com a TABELA1. É possivel fazer este update utilizano a função INNER JOIN filtrando os dados da TABELA1 juntamente com o campo data da TABELA2?

    Obrigado.

    terça-feira, 8 de maio de 2012 12:03

Todas as Respostas

  • Bom dia Ericke,

    Tem como fazer isto sim, veja se o exemplo abaixo te ajuda.

    -- Tabelas
    CREATE TABLE TABELA1(
    ID		INT,
    INFO	VARCHAR(10));
    
    CREATE TABLE TABELA2(
    ID		INT,
    DATA	DATE,
    INFO	VARCHAR(10));
    
    -- Inserindo dados nas tabelas
    INSERT INTO TABELA1 VALUES(1,'Teste');
    INSERT INTO TABELA1 VALUES(2,'Teste2');
    
    INSERT INTO TABELA2 VALUES(2,'2012-05-01','Teste2');
    INSERT INTO TABELA2 VALUES(2,'2012-07-01','Teste2');
    INSERT INTO TABELA2 VALUES(4,'2012-06-01','Teste2');
    
    -- UPDATE
    UPDATE TABELA1 SET INFO = 'ALTERADA'
    FROM 
    TABELA1 T1 INNER JOIN TABELA2 T2 ON T1.ID = T2.ID
    WHERE T2.DATA = '2012-07-01';
    
    -- Resultado
    SELECT * FROM TABELA1
    
    /*
    -- Dropando as tabelas
    DROP TABLE TABELA1
    DROP TABLE TABELA2
    */


    Adriano Nascimento

    terça-feira, 8 de maio de 2012 12:19
  • Bom dia Adriano!

    Muito obrigado pelo retorno, mas como mencionei, sou leigo no assunto, então ficou uma dúvida: Como ja possuo as tabelas no sistema não preciso fazer esta criação e inserção de dados, certo?

    Pulei diretamente para a parte do UPDATE, e montei da seguinte forma:

    UPDATE E660INC SET CSTPIS=50

    FROM

    E660INC INNER JOIN E440NFC ON E440NFC.NUMNFC=E660INC.NUMNFI

    WHERE E440NFC.DATENT >= '01/03/2012'

    Desta forma está retornando o seguinte erro: comando SQL não encerrado adequadamente.

    Estou fazendo algo errado?

    Obrigado.

    terça-feira, 8 de maio de 2012 12:59
  • Acho que faltou especificar qual a tabela que CSTPIS pertence:

    UPDATE E660INC SET E660INC.CSTPIS=50 FROM E660INC

    INNER JOIN E440NFC ON E440NFC.NUMNFC=E660INC.NUMNFI WHERE E440NFC.DATENT >= '01/03/2012'


    Abraços!


    thiagokoelho

    terça-feira, 8 de maio de 2012 13:09
  • Acho que faltou especificar qual a tabela que CSTPIS pertence:

    UPDATE E660INC SET E660INC.CSTPIS=50 FROM E660INC

    INNER JOIN E440NFC ON E440NFC.NUMNFC=E660INC.NUMNFI WHERE E440NFC.DATENT >= '01/03/2012'


    Abraços!


    thiagokoelho

    Especifiquei a tabela de CSTPIS, conforme acima, porém o comando ainda apresenta o mesmo erro.

    terça-feira, 8 de maio de 2012 13:15
  • Ericke,

    O seu comando esta correto.

    Mas qual a sua versão do Sql Server?


    Adriano Nascimento

    terça-feira, 8 de maio de 2012 13:47
  • Hum.. acho que aí está o problema.. eu to postando a questão em lugar errado...

    O meu banco de dados na verdade é oracle... e eu estou com problema no comando SQL..

    Se mesmo assim puder me ajudar, agradeço!!

    e peço desculpas pela mancada.. realmente não tinha visto que o forum era sobre o SQL Server apenas..

    terça-feira, 8 de maio de 2012 13:52
  • Esse erro é de Oracle

    thiagokoelho

    terça-feira, 8 de maio de 2012 14:11
  • No Oracle tem várias formas de fazer isso, por exemplo, você pode usar o MERGE

    MERGE INTO
    TABELA t1
    USING
    (SELECT *
      FROM TABELA2
      WHERE ) t2
    ON (t1.NOME = t2.NOME)
    WHEN MATCHED THEN
      UPDATE SET t1.IDENT = t2.IDENT;

    ou usar um UPDATE em cima de uma sub-query, assim:

    UPDATE (select TABELA1 SET INFO = 'ALTERADA'
        FROM TABELA1 T1 INNER JOIN TABELA2 T2 ON T1.ID = T2.ID
        WHERE T2.DATA = '2012-07-01') VW
    SET INFO = 'ALTERADA';






    MCSD Charter Member (since 1995), MCSE+I, MCDBA, MCNPS, MCP+SB, MCTS, MCBSS/MCBSP: Dynamics CRM, MCT

    quarta-feira, 9 de maio de 2012 16:32