UPDATE em tabela utilizando outra como referencia
14/06/2012
0
estou tentando fazer um update em uma tabela alterando um campo de uma determinada coluna e linha de O para E
desta forma:
UPDATE CONTROL.L_PROCES_CONTXT
SET CONTXT_STATUS_COD = E
WHERE CONTXT_STATUS_COD = O
AND PROCES_COD = ODS_I_MOVIM_NFR -- NOME DA INTERFACE
AND CONTXT_COD IN (42298574) -- CODIGO DO CONTEXTO
COMMIT;
So que para conseguir este codigo do contexto eu preciso primeiro fazer um select em outra tabela com as informações:
SELECT PCP.PARAM_VAL as SITE, PC.*
FROM CONTROL.L_PROCES_CONTXT PC, CONTROL.L_PROCES_CONTXT_PARAM PCP
WHERE PC.CONTXT_COD = PCP.CONTXT_COD
AND PC.PROCES_COD in (ODS_I_MOVIM_NFR) -- INFORMAÇÕES QUE POSSUO ( INTERFACE )
AND PCP.PARAM_KEY_COD = SITE_COD
AND TO_CHAR(PCP.PARAM_VAL) IN (448) -- INFORMAÇÕES QUE POSSUO ( CODIGO LOJA )
AND PC.CREATE_DAT >= SYSDATE-(1/2)
ORDER BY PC.CREATE_DAT DESC;
As duas tabelas possuem a coluna CONTXT_COD iguais, porém a primeira que é a qual tenho que alterar o Status de O para E não possue o campo que consta o codigo da loja, o que eu queria era realizar este update na primeira sem precisar toda vez fazendo um select para conseguir o numero do contexto, eu tentei o seguinte mas não deu certo:
UPDATE CONTROL.L_PROCES_CONTXT A
SET A.CONTXT_STATUS_COD = E
WHERE A.CONTXT_STATUS_COD = O
AND PROCES_COD IN (ODS_I_MOVIM_NFR)
AND (select B.CONTXT_COD from CONTROL.L_PROCES_CONTXT_PARAM B
Where B.PARAM_KEY_COD = SITE_COD
and B.PARAM_VAL in (102)) A.CONTXT_COD = B.CONTXT_COD
Alguem pode me ajudar?
Agradeço desde ja, atenciosamente,
Giuliano Gobbi
Posts
14/06/2012
Emanoély Gura
Algo tipo:
UPDATE tabela1
SET
campo1 = tabela2.campo1
FROM tabela2
JOIN tabela1 ON ...
só um detalhe, quando você usa esse tipo de update, você DEVE fazer teu join com a tabela1 ou seja, aquela que sofrerá o update, caso contrário, todos os dados serão alterados e vc vai precisar de BACKUP.
Tome cuidado.. diz se conseguiu..
:)
Abraaass
15/06/2012
Giuliano Gobbi
Com Select eu consegui:
SELECT * FROM CONTROL.L_PROCES_CONTXT
INNER JOIN CONTROL.L_PROCES_CONTXT_PARAM
ON CONTROL.L_PROCES_CONTXT.CONTXT_COD = CONTROL.L_PROCES_CONTXT_PARAM.CONTXT_COD
AND PARAM_KEY_COD = SITE_COD
AND PARAM_VAL in (102)
AND PROCES_COD IN (ODS_I_IMP_POS_ESTQUE_NFR)
AND END_DAT >= TO_DATE(14/06/2012 22:00, DD/MM/YYYY HH24:MI);
Porem com UPDATE, eu tentei deste jeito e apresentou erro:
UPDATE CONTROL.L_PROCES_CONTXT
SET CONTROL.L_PROCES_CONTXT.CONTXT_STATUS_COD = E
INNER JOIN CONTROL.L_PROCES_CONTXT
ON CONTROL.L_PROCES_CONTXT.CONTXT_COD = CONTROL.L_PROCES_CONTXT_PARAM.CONTXT_COD
WHERE CONTROL.L_PROCES_CONTXT.CONTXT_STATUS_COD = O
AND PARAM_KEY_COD = SITE_COD
AND PARAM_VAL in (102)
AND PROCES_COD IN (ODS_I_IMP_POS_ESTQUE_NFR)
AND END_DAT >= TO_DATE(14/06/2012 22:00, DD/MM/YYYY HH24:MI);
15/06/2012
Emanoély Gura
Então.. faltou o FROM, antes do inner join.
Repare que a única coisa que vc mudará do select de cima é justamente o Select *, trocando por update tabela set campo = , o resto do código, do from em diante, ficará o mesmo.
Teste aí e conte se rolou..
:)
19/06/2012
Giuliano Gobbi
Então, é justamente o FROM que ta dando erro rs, não estou entendendo tambem, eu tirei 2 prints para poder visualizar melhor
Este é do SELECT, funciona perfeitamente:
http://i50.tinypic.com/akixwg.jpg
Este é do UPDATE que esta dando o erro:
http://i47.tinypic.com/2py6umc.jpg
Alguma ideia? rs
19/06/2012
Joao Moreira
update tabela set
campo = es.campo,
campo = c.campo,
campo = v.campo,
campo = e.campo,
campo = s.campo
from tabela a
inner join outratabela v on (a.campo = v.campo)
inner join outratabela c on (v.campo = c.campo)
inner join outratabela e on (v.campo = e.campo)
inner join outratabela s on (v.campo = s.campo)
inner join outratabela es on (v.campo = es.campo)
20/06/2012
Giuliano Gobbi
UPDATE CONTROL.L_PROCES_CONTXT A
SET A.CONTXT_STATUS_COD = E
FROM CONTROL.L_PROCES_CONTXT_PARAM B
INNER JOIN CONTROL.L_PROCES_CONTXT_PARAM B
ON B.CONTXT_COD = A.CONTXT_COD
WHERE A.CONTXT_STATUS_COD = O
AND B.PARAM_KEY_COD = SITE_COD
AND B.PARAM_VAL in (617)
AND A.PROCES_COD IN (ODS_I_IMP_POS_ESTQUE_NFR)
AND A.END_DAT >= TO_DATE(19/06/2012 22:00, DD/MM/YYYY HH24:MI);
Acho que não seja possivel fazer UPDATE com INNER JOIN.
20/06/2012
Maxwell Chaves
pois o seu script aparentemente esta correto.
21/06/2012
Giuliano Gobbi
Então, é justamente o FROM que ta dando erro rs, não estou entendendo tambem, eu tirei 2 prints para poder visualizar melhor
Este é do SELECT, funciona perfeitamente:
http://i50.tinypic.com/akixwg.jpg
Este é do UPDATE que esta dando o erro:
http://i47.tinypic.com/2py6umc.jpg
Alguma ideia? rs
Eu postei... na verdade eu uso PL/SQL - SQL Window
21/06/2012
Maxwell Chaves
no print apos o FROM voce nao colocou o nome da TABELA,
no seu SELECT voce fez certo agora no UPDATE voce esqueceu de colocar o nome e olha
que no post voce colocou certinho.
Favor verificar o seu scritp
Segue uma pequeno exemplo:
update TABELA set CAMPO = 1 FROM TABELA INNER JOIN T2 on T2.codigo = TABELA.CODIGO WHERE CAMPO = 20
22/06/2012
Giuliano Gobbi
no print apos o FROM voce nao colocou o nome da TABELA,
no seu SELECT voce fez certo agora no UPDATE voce esqueceu de colocar o nome e olha
que no post voce colocou certinho.
Favor verificar o seu scritp
Segue uma pequeno exemplo:
update TABELA set CAMPO = 1 FROM TABELA INNER JOIN T2 on T2.codigo = TABELA.CODIGO WHERE CAMPO = 20
Obrigado pela ajuda, mas não foi isso tambem, afinal ele nem chega a passar do FROM, da erro antes, segue print do jeito que você mostrou:
http://i50.tinypic.com/bwt90.jpg
Atenciosamente,
22/06/2012
Alex Lekao
Nao sei se estou entendendo bem o problema que esta acontecendo e se consegui ler direito o que foi escrito no script mas me parece que esta apelidando tabelas diferentes com o mesmo apelido e algumas coisa com relacao a sintaxe do update.
Se nao me engano nao precisaria usar um apelido na tabela logo depois do update.
Acho que o pessoal podera ajudar tambem nesta questao que eles teem mais experiencia que eu.
Sou iniciante neste mundo do sql... rsrsr
Abraco.
23/06/2012
Giuliano Gobbi
Nao sei se estou entendendo bem o problema que esta acontecendo e se consegui ler direito o que foi escrito no script mas me parece que esta apelidando tabelas diferentes com o mesmo apelido e algumas coisa com relacao a sintaxe do update.
Se nao me engano nao precisaria usar um apelido na tabela logo depois do update.
Acho que o pessoal podera ajudar tambem nesta questao que eles teem mais experiencia que eu.
Sou iniciante neste mundo do sql... rsrsr
Abraco.
Não, se você observar as duas tabelas são:
CONTROL.L_PROCES_CONTXT - que eu apelidei de A
e
CONTROL.L_PROCES_CONTXT_PARAM - que eu apelidei de B
O Apelido não influencia.
Obrigado pela ajuda.
23/06/2012
Alex Lekao
Blz entao... eh que estava olhando o script e no inicio esta update control.l_proces_context a e no from control.l_proces_context a igual antes.
Eu tive um problema com relacao a um update tambem que utilizava um banco e uma tabela de fora e tive que usar um script parecido com o seu, se nao me engano no update eu coloquei o apelido e no from coloquei a tabela normal, ficaria acredito que mais ou menos assim no seu caso.
update a set a.contxt_status_cod = E
from control.l_proces_contxt a
inner join control.l_proces_contxt_param b
como disse sou novato nesse mundo tbm entao... desculpe se estiver errado. rsrs
so uma curiosidade... vc esta usando sql server mesmo?
tenha um bom dia e um bom fds....
abraco.
23/06/2012
Paulo Carrião
Olá Giuliano Gobbi,
Para resolver o problema basta fazer o update com inner join!
Em sql server é possivel sim fazer update com inner join, segue um exemplo básico de como fazer isto:
update Tabela1
set Tabela1.campo1=Tabela2.campo1
from Tabela1 INNER JOIN Tabela2
ON Tabela1.Chave = Tabela2.Chave
Portanto, só fazer a sua lógica com update com inner join e resolve o problema.
Grato,
Paulo Carrião (Analista programador)
Clique aqui para fazer login e interagir na Comunidade :)