Update no campo com valor de outra tabela com JOIN
08/07/2019
0
Preciso fazer um Update em um campo de uma tabela. Só que precisa trazer valores de outra tabel para esse campo.
Tenho três tabelas envolvidas
SELECT * FROM PRODUTO
WHERE CD_PRODUTO = 128
cd_produto = 128
cd_especie = 1 (drogas e medicamentos)
SELECT * FROM UNI_PRO
WHERE CD_PRODUTO = 128
Cd_produto = 128|Cd_uni_pro = 238 |cd_uni_pro = UN |cd_unidade = UNIDADE
d_produto = 128 | cd_uni_pro = 239 |cd_uni_pro = MG |cd_unidade = COMP C/25MG
SELECT * FROM IDENTIFICADOR_ETIQUETA
WHERE CD_PRODUTO = 128
CD_IDENTICADOR = 365 | CD_PRODUTO = 128 | CD_UNI_PRO = 239
Eu preciso alterar na tabela IDENTIFICADOR_ETIQUETA, o CD_UNI_PRO que está com a unidade incorreta de acordo com a tabela UNI_PRO. O certo é 238 = Unidade, Detahe que eu preciso alterar para todos os produtos da Tabel identificador_etiqueta.
Montei dois Updates amarrando somente um único código para teste.
UPDATE IDENTIFICADOR_ETIQUETA SET CD_UNI_PRO =CD_UNI_PRO
WHERE CD_UNI_PRO IN (SELECT UNI_PRO.CD_UNI_PRO FROM UNI_PRO
JOIN PRODUTO ON PRODUTO.CD_PRODUTO = UNI_PRO.CD_PRODUTO
WHERE PRODUTO.CD_ESPECIE = ''''''''1''''''''
AND UNI_PRO.CD_UNIDADE = ''''''''UN''''''''
AND UNI_PRO.SN_ATIVO = ''''''''S''''''''
AND PRODUTO.CD_PRODUTO = 128)
AND IDENTIFICADOR_ETIQUETA.CD_PRODUTO = 128
Diz Text
Update - 0 row(s), executed in 15 ms
Total execution time 31 ms
OU
UPDATE IDENTIFICADOR_ETIQUETA
SET CD_UNI_PRO = (SELECT UNI_PRO.CD_UNI_PRO FROM UNI_PRO
JOIN PRODUTO ON PRODUTO.CD_PRODUTO = UNI_PRO.CD_PRODUTO
WHERE PRODUTO.CD_ESPECIE = ''''''''1''''''''
AND UNI_PRO.CD_UNIDADE = ''''''''UN''''''''
AND UNI_PRO.SN_ATIVO = ''''''''S''''''''
AND PRODUTO.CD_PRODUTO IN (128)
AND ROWNUM= 1)
WHERE IDENTIFICADOR_ETIQUETA.CD_PRODUTO IN (128) -- Dessa forma, funciona. Quando insiro, mais itens, ele pega um UNI_PRO único e replica para vários.
Paula Barbosa
Post mais votado
11/07/2019
UPDATE IDETIQ SET IDETIQ.CD_UNI_PRO = UPRO.CD_UNI_PRO FROM IDENTIFICADOR_ETIQUETA IDETIQ INNER JOIN UNI_PRO UPRO ON UPRO.CD_PRODUTO = IDETIQ.CD_PRODUTO AND UPRO.SN_ATIVO = 'S' AND UPRO.CD_UNIDADE = 'UN' INNER JOIN PRODUTO P ON P.CD_PRODUTO = UPRO.CD_PRODUTO AND P.CD_ESPECIE = '1' WHERE IDETIQ.CD_PRODUTO IN (128)
Na verdade basta você montar a instrução (select) que retorne os dados como você precisa, e depois trocar o select por update.
Emerson Nascimento
Mais Posts
09/07/2019
Sérgio Saibel
Não sei se entendi direito, mas vê se isso resolve teu problema...
<SQL>
UPDATE IDENTIFICADOR_ETIQUETA SET CD_UNI_PRO =
(SELECT UNI_PRO.CD_UNI_PRO
FROM UNI_PRO
JOIN PRODUTO ON PRODUTO.CD_PRODUTO = UNI_PRO.CD_PRODUTO
WHERE PRODUTO.CD_ESPECIE = ''''''''1''''''''
AND UNI_PRO.CD_UNIDADE = ''''''''UN''''''''
AND UNI_PRO.SN_ATIVO = ''''''''S''''''''
AND PRODUTO.CD_PRODUTO = 128)
WHERE IDENTIFICADOR_ETIQUETA.CD_PRODUTO = 128
</SQL>
Se a sua amarração de tabelas estiver correta acho que isso resolve o problema.
Abraço
09/07/2019
Paula Barbosa
Não sei se entendi direito, mas vê se isso resolve teu problema...
<SQL>
UPDATE IDENTIFICADOR_ETIQUETA SET CD_UNI_PRO =
(SELECT UNI_PRO.CD_UNI_PRO
FROM UNI_PRO
JOIN PRODUTO ON PRODUTO.CD_PRODUTO = UNI_PRO.CD_PRODUTO
WHERE PRODUTO.CD_ESPECIE = ''''''''1''''''''
AND UNI_PRO.CD_UNIDADE = ''''''''UN''''''''
AND UNI_PRO.SN_ATIVO = ''''''''S''''''''
AND PRODUTO.CD_PRODUTO = 128)
WHERE IDENTIFICADOR_ETIQUETA.CD_PRODUTO = 128
</SQL>
Se a sua amarração de tabelas estiver correta acho que isso resolve o problema.
______________________________________________________||_______________________________________________
Sérgio, bom dia!
Obrigada pelo retorno. O problema é que tenho + de 1 codigo específico dentro da tabela produto que está presente na tabela identificador de etiquetas. Se eu fizer dessa forma que informou, o código roda somente para 1 item. Se eu colocar mais itens. Ele me traz erro. Exemplo:
UPDATE IDENTIFICADOR_ETIQUETA SET CD_UNI_PRO =
(SELECT UNI_PRO.CD_UNI_PRO
FROM UNI_PRO
JOIN PRODUTO ON PRODUTO.CD_PRODUTO = UNI_PRO.CD_PRODUTO
WHERE PRODUTO.CD_ESPECIE = 1
AND UNI_PRO.CD_UNIDADE = 'UN'
AND UNI_PRO.SN_ATIVO = 'S'
AND PRODUTO.CD_PRODUTO IN (7,
8 ,
9 ,
12,
13,
14,
15,
16,
17,
19,
20,
21,
22))
WHERE IDENTIFICADOR_ETIQUETA.CD_PRODUTO IN (7,
8,
9,
12,
13,
14,
15,
16,
17,
19,
20,
21,
22)
Erro: ORA-01427: a subconsulta de uma única linha retorna mais de uma linha.
Por isso, tinha colocado o RowNum, pois ele meio que burla essa mensagem. Só que, ele pega o valor UNI_PRO.CD_PRODUTO e replica para o restante dos códigos.
09/07/2019
Sérgio Saibel
Não sei se entendi direito, mas vê se isso resolve teu problema...
<SQL>
UPDATE IDENTIFICADOR_ETIQUETA SET CD_UNI_PRO =
(SELECT UNI_PRO.CD_UNI_PRO
FROM UNI_PRO
JOIN PRODUTO ON PRODUTO.CD_PRODUTO = UNI_PRO.CD_PRODUTO
WHERE PRODUTO.CD_ESPECIE = ''''''''''''''''1''''''''''''''''
AND UNI_PRO.CD_UNIDADE = ''''''''''''''''UN''''''''''''''''
AND UNI_PRO.SN_ATIVO = ''''''''''''''''S''''''''''''''''
AND PRODUTO.CD_PRODUTO = 128)
WHERE IDENTIFICADOR_ETIQUETA.CD_PRODUTO = 128
</SQL>
Se a sua amarração de tabelas estiver correta acho que isso resolve o problema.
______________________________________________________||_______________________________________________
Sérgio, bom dia!
Obrigada pelo retorno. O problema é que tenho + de 1 codigo específico dentro da tabela produto que está presente na tabela identificador de etiquetas. Se eu fizer dessa forma que informou, o código roda somente para 1 item. Se eu colocar mais itens. Ele me traz erro. Exemplo:
UPDATE IDENTIFICADOR_ETIQUETA SET CD_UNI_PRO =
(SELECT UNI_PRO.CD_UNI_PRO
FROM UNI_PRO
JOIN PRODUTO ON PRODUTO.CD_PRODUTO = UNI_PRO.CD_PRODUTO
WHERE PRODUTO.CD_ESPECIE = 1
AND UNI_PRO.CD_UNIDADE = ''UN''
AND UNI_PRO.SN_ATIVO = ''S''
AND PRODUTO.CD_PRODUTO IN (7,
8 ,
9 ,
12,
13,
14,
15,
16,
17,
19,
20,
21,
22))
WHERE IDENTIFICADOR_ETIQUETA.CD_PRODUTO IN (7,
8,
9,
12,
13,
14,
15,
16,
17,
19,
20,
21,
22)
Erro: ORA-01427: a subconsulta de uma única linha retorna mais de uma linha.
Por isso, tinha colocado o RowNum, pois ele meio que burla essa mensagem. Só que, ele pega o valor UNI_PRO.CD_PRODUTO e replica para o restante dos códigos.
Beleza...
Só que o que estas tentando fazer não pode ser feito desta forma. O update somente altera um CD_PRODUTO por vez. Se tens mais de um código a ser alterado e o valor for o mesmo então retira da cláusula, do primeiro WHERE ...
<SQL>
WHERE PRODUTO.CD_ESPECIE = 1
AND UNI_PRO.CD_UNIDADE = ''UN''
AND UNI_PRO.SN_ATIVO = ''S''
</SQL>
Se para cada código de produto for um valor diferente então sugiro criar uma função do tipo:
<SQL>
CREATE OR REPLACE FUNCTION __atualizar_etiqueta()
RETURNS INTEGER AS $__atualizar_etiqueta$
DECLARE
rx RECORD;
v_rows INTEGER;
BEGIN
FOR rx IN (SELECT PRODUTO.CD_PRODUTO , UNI_PRO.CD_UNI_PRO FROM UNI_PRO JOIN PRODUTO ON PRODUTO.CD_PRODUTO = UNI_PRO.CD_PRODUTO WHERE PRODUTO.CD_ESPECIE = 1 AND UNI_PRO.CD_UNIDADE = ''UN'' AND UNI_PRO.SN_ATIVO = ''S'' AND PRODUTO.CD_PRODUTO IN (7, 8 ,9 ,12,13,14,15,16,17,19,20,21,22) LOOP
BEGIN
-- Altera os valores do código com base nos valores da tabela 2
UPDATE IDENTIFICADOR_ETIQUETA SET CD_UNI_PRO = rx.CD_UNI_PRO
WHERE IDENTIFICADOR_ETIQUETA.CD_PRODUTO = rx.CD_PRODUTO ;
END;
END LOOP;
RETURN row_count;;
END;
$__atualizar_etiqueta$ LANGUAGE plpgsql;
</SQL>
Mais ou menos isso, para executar
SELECT __atualizar_etiqueta;
Espero ter ajudado, tenta e posta o resultado. Abraço
Clique aqui para fazer login e interagir na Comunidade :)
Inserção de url
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.