- Este tópico contém 7 respostas, 3 vozes e foi atualizado pela última vez 13 anos, 5 meses atrás por filipedc.
-
AutorPosts
-
20 de julho de 2011 às 6:23 pm #100079filipedcParticipante
Pessoal,
Sou novo aqui no forum e estou precisando de uma ajuda pra concluir um update
UPDATE
TGFCTE CTE
SET
CTE.QTDEST = CTE.QTDEST +
(SELECT DISTINCT QTDEST
FROM
TGFCTE CT
WHERE
CT.DTCONTAGEM = CTE.DTCONTAGEM
AND ((CT.CODLOCAL > 1980000
AND CT.CODLOCAL <= 1990000) OR (CT.CODLOCAL > 6980000 AND CT.CODLOCAL <=6990000)) AND CT.CODPROD = CTE.CODPROD) WHERE CTE.DTCONTAGEM='17/07/2011' Se eu fizer o mesmo update colocando um produto definido ele da certo e atualiza so que eu preciso dar o update na tabela inteira e sem produto o oracle me retorna o erro: a subconsulta de uma unica linha retorna mais de uma linha20 de julho de 2011 às 6:30 pm #100080leandrolbsParticipanteCara, esse select seu está retornando mais de uma linha…
select * from TGFCTE CTE
where exists (
SELECT * FROM TGFCTE CT
WHERE CT.DTCONTAGEM = CTE.DTCONTAGEM
AND ((CT.CODLOCAL > 1980000 AND CT.CODLOCAL 6980000 AND CT.CODLOCAL <=6990000))
AND CT.CODPROD = CTE.CODPROD)Roda este select, veja qtas linhas vai trazer….
para finalizar isto, uma simples clasula ajudaria… o MAX(), porem dependendo da informação na tabela, o resultado não ficaria o esperado…
mas tente:
[...]
(SELECT max(QTDEST)
FROM
TGFCTE CT
[...]
20 de julho de 2011 às 7:17 pm #100081rmanParticipanteVerifica se não esta faltando ligação entre as tabelas TGFCTE CTE e TGFCTE CT, é apenas CT.DTCONTAGEM = CTE.DTCONTAGEM e CT.CODPROD = CTE.CODPROD ? Talvez está sendo criado um produto cartesiano…
20 de julho de 2011 às 8:02 pm #100083filipedcParticipantetestei com o max e nao deu certo ele zerou o qtdest para aqueles que nao existiam valor nos locais da regra, em questao das ligacoes faz so mais uma que e a do codigo da empresa ct.codemp = cte.codemp
Me falaram pra fazer com inner join so que nao entendo mto bem a escrita do inner join
20 de julho de 2011 às 8:49 pm #100084rmanParticipanteNão consegui entender o que você precisa fazer…
Você está tentando atualizar o campo QTDEST da TGFCTE, utilizando a tabela TGFCTE, ou seja, ela mesma… é isso mesmo ?
Utilizando a terceira ligação, também da erro ?
O a sintaxe do inner join é assim
SELECT *
FROM PAI P
INNER JOIN FILHO F ON F.ID_PAI = P.ID_PAI
isso corresponde a
SELECT *
FROM PAI P, FILHO F
WHERE F.ID_PAI = P.ID_PAI
20 de julho de 2011 às 9:03 pm #100085filipedcParticipanteExato! na tabela tgfcte tenho duas linhas de um mesmo produto que a unica coisa que diferencia eles e o codlocal, preciso somar essas duas linhas criando um qtdest so.
entendi a nomeclatura do join, entao no caso so teria como usar o join se caso fosse de tabelas diferentes??
20 de julho de 2011 às 9:18 pm #100087rmanParticipante[quote=”filipedc”:245e1uvj]Exato! na tabela tgfcte tenho duas linhas de um mesmo produto que a unica coisa que diferencia eles e o codlocal, preciso somar essas duas linhas criando um qtdest so.
entendi a nomeclatura do join, entao no caso so teria como usar o join se caso fosse de tabelas diferentes??[/quote]
Verifica se é isso que você quer fazer
CODPROD – QTDEST – CODLOCAL
10 – 5 – 35
10 – 4 – 40Após UPDATE
CODPROD – QTDEST – CODLOCAL
10 – 9 – 35
10 – 9 – 40O produto 10 possui quantidade 5 no local 35 e 4 no local 40, depois do UPDATE o produto 10 possui 9 no local 35 e 9 no local 40, é isso que você quer fazer ?
Se for tente:
UPDATE
TGFCTE CTE
SET
CTE.QTDEST = CTE.QTDEST +
(SELECT SUM(COALESCE(QTDEST,0))
FROM
TGFCTE CT
WHERE
CT.DTCONTAGEM = CTE.DTCONTAGEM
AND ((CT.CODLOCAL > 1980000
AND CT.CODLOCAL 6980000 AND CT.CODLOCAL <=6990000))
AND CT.CODPROD = CTE.CODPROD) WHERE CTE.DTCONTAGEM='17/07/2011'
O INNER JOIN pode ser usado em auto relacionamento também…
20 de julho de 2011 às 9:39 pm #100089filipedcParticipanteRman consegui aqui da seguinte maneira executei a linha de comando que voce passou e percebi que para aqueles que nao tinham qtdest em dois locais ele tava zerando o meu qtdest, entao coloquei um nvl na frente do subselect ai resolveu o problema
UPDATE
TGFCTE CTE
SET
CTE.QTDEST = CTE.QTDEST +
NVL((SELECT SUM(COALESCE(QTDEST,0))
FROM
TGFCTE CT
WHERE
CT.DTCONTAGEM = CTE.DTCONTAGEM
AND ((CT.CODLOCAL > 1980000
AND CT.CODLOCAL 6980000 AND CT.CODLOCAL <=6990000))
AND CT.CODPROD = CTE.CODPROD),0) WHERE CTE.DTCONTAGEM='17/07/2011'cara vlw ai!!!
-
AutorPosts
- Você deve fazer login para responder a este tópico.