Array
(
)

UPDATE em tabela utilizando outra como referencia

Giuliano Gobbi
   - 14 jun 2012

Olá,
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,

Manu Gura
   - 14 jun 2012

Tenta fazer diferente..

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

Giuliano Gobbi
   - 15 jun 2012

Ola, Primeiramente obrigado pela ajuda,

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);

Manu Gura
   - 15 jun 2012

De nada, estamos aqui pra isso.. :)

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..

:)

Giuliano Gobbi
   - 19 jun 2012

Oi,

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

João Arthur
|
MVP
Pontos: 700
    19 jun 2012

segue um exemplo

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)

Giuliano Gobbi
   - 20 jun 2012

Ainda dando o mesmo erro do print fazendo o update da forma como falou:

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.

João Arthur
|
MVP
Pontos: 700
    20 jun 2012

cara é possível sim, voce ta usando SQL Server ?

Maxwell Chaves
   - 20 jun 2012

Guiliano, posta a mensagem de erro que facilita mais.
pois o seu script aparentemente esta correto.

Giuliano Gobbi
   - 21 jun 2012


Citação:
Oi,

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

Maxwell Chaves
   - 21 jun 2012

Guiliano,

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:

#Código

update TABELA set CAMPO = 1 
FROM TABELA
INNER JOIN T2 on T2.codigo = TABELA.CODIGO
WHERE CAMPO = 20

Giuliano Gobbi
   - 22 jun 2012


Citação:
Guiliano,

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:

#Código

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,

Alex Lekao
   - 22 jun 2012

Ola Boa tarde!!!

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.

Giuliano Gobbi
   - 23 jun 2012


Citação:
Ola Boa tarde!!!

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.

Alex Lekao
   - 23 jun 2012

Oi Bom dia!!

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.

Paulo Carrião
   - 23 jun 2012


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)

Camara Campos
   - 13 set 2015

Boa Tarde, podem me ajudar neste UPDATE por favor, estou com os dados origens na tabela BUSSOLA e preciso pegar os dados na tabela CEP e atualizar os campos da BUSSOLA.

UPDATE bussola b SET
b.END_CEP = c.cep,
b.END_TIPO_LOGRADOURO = c.tipo,
b.END_LOGRADOURO = c.logradouro,
b.END_BAIRRO = c.bairro,
b.END_COMPLEMENTO = c.complemento,
b.END_CIDADE = c.cidade,
b.END_UF = c.uf
WHERE b.END_CEP = (SELECT c.CEP,c.TIPO,c.LOGRADOURO,c.BAIRRO,c.COMPLEMENTO,c.CIDADE,c.UF FROM CEP c)
AND
b.END_CEP = c.CEP

Esta gerando este erro: Operand should contain 1 column(s)

Obrigado.

Alex Lekao
   - 15 set 2015

essa instrucao deve ter apenas uma coluna.

#Código

 (SELECT c.CEP,c.TIPO,c.LOGRADOURO,c.BAIRRO,c.COMPLEMENTO,c.CIDADE,c.UF FROM CEP c)


sugeriria abrir um novo post com a duvida para ter uma ajuda mais efetiva.

talvez nao teve responsta por ser um post antigo.