UPDATE em tabela utilizando outra como referencia
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,
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
Curtidas 0
Respostas
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
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
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);
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
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..
:)
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
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
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
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)
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
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.
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
14/06/2012
cara é possível sim, voce ta usando SQL Server ?
GOSTEI 0
Maxwell Chaves
14/06/2012
Guiliano, posta a mensagem de erro que facilita mais.
pois o seu script aparentemente esta correto.
pois o seu script aparentemente esta correto.
GOSTEI 0
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
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
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:
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
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:
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
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.
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
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.
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
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.
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
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
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.
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
14/06/2012
essa instrucao deve ter apenas uma coluna.
sugeriria abrir um novo post com a duvida para ter uma ajuda mais efetiva.
talvez nao teve responsta por ser um post antigo.
(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
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)
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
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)
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
14/06/2012
Tenta assim
UPDATE TABELA1 SET
CAMPO1 = (select first 1 TABELA2 from CAMPO2 where TABELA1.campo = condição qualquer)
UPDATE TABELA1 SET
CAMPO1 = (select first 1 TABELA2 from CAMPO2 where TABELA1.campo = condição qualquer)
GOSTEI 0
Matheus Bueno
14/06/2012
Tenta assim
UPDATE TABELA1 SET
CAMPO1 = (select first 1 TABELA2 from CAMPO2 where TABELA1.campo = condição qualquer)
UPDATE TABELA1 SET
CAMPO1 = (select first 1 TABELA2 from CAMPO2 where TABELA1.campo = condição qualquer)
GOSTEI 0