UPDATE em tabela utilizando outra como referencia

SQL Server

14/06/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,
Giuliano Gobbi

Giuliano Gobbi

Curtidas 0

Respostas

Emanoély Gura

Emanoély Gura

14/06/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
GOSTEI 0
Giuliano Gobbi

Giuliano Gobbi

14/06/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);

GOSTEI 0
Emanoély Gura

Emanoély Gura

14/06/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..

:)
GOSTEI 0
Giuliano Gobbi

Giuliano Gobbi

14/06/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
GOSTEI 0
Joao Moreira

Joao Moreira

14/06/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)
GOSTEI 0
Giuliano Gobbi

Giuliano Gobbi

14/06/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.
GOSTEI 0
Joao Moreira

Joao Moreira

14/06/2012

cara é possível sim, voce ta usando SQL Server ?
GOSTEI 0
Maxwell Chaves

Maxwell Chaves

14/06/2012

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

Giuliano Gobbi

14/06/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


Eu postei... na verdade eu uso PL/SQL - SQL Window
GOSTEI 0
Maxwell Chaves

Maxwell Chaves

14/06/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:

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

Giuliano Gobbi

14/06/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:

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,
GOSTEI 0
Alex Lekao

Alex Lekao

14/06/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.
GOSTEI 0
Giuliano Gobbi

Giuliano Gobbi

14/06/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.


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.
GOSTEI 0
Alex Lekao

Alex Lekao

14/06/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.
GOSTEI 0
Paulo Carrião

Paulo Carrião

14/06/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)
GOSTEI 0
Camara Campos

Camara Campos

14/06/2012

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.
GOSTEI 0
Alex Lekao

Alex Lekao

14/06/2012

essa instrucao deve ter apenas uma coluna.

 (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.
GOSTEI 0
Matheus Bueno

Matheus Bueno

14/06/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)
GOSTEI 0
Matheus Bueno

Matheus Bueno

14/06/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)
GOSTEI 0
Matheus Bueno

Matheus Bueno

14/06/2012

Tenta assim
UPDATE TABELA1 SET
CAMPO1 = (select first 1 TABELA2 from CAMPO2 where TABELA1.campo = condição qualquer)
GOSTEI 0
Matheus Bueno

Matheus Bueno

14/06/2012

Tenta assim
UPDATE TABELA1 SET
CAMPO1 = (select first 1 TABELA2 from CAMPO2 where TABELA1.campo = condição qualquer)
GOSTEI 0
POSTAR