Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

victorpavia

UPDATE + SUBQuery

Recommended Posts

Boa tarde pessoal,

 

Tenho essa consulta que me retorna 353 registros:

 

select distinct di.idlaf,di.numitem,dic.natrec from dlaf dl 
inner join ditem di on (di.idlaf = dl.idlaf)
left join ditemcompl dic on (dic.idlaf = di.idlaf and di.numitem = dic.numitem)
inner join tprd tp on (tp.idprd = di.idprd)
inner join dtrbitem dti on (dti.idlaf = di.idlaf and dti.numitem = di.numitem)
where tp.descricao like '%arroz%' and dl.tipolf = 'S'
and dl.dataemissao >= '2011/08/01' and dl.dataemissao <= '2011/08/31'
and dti.sittributaria  in ('04','06') and dl.seriedoc in ('1','ECF')
and dic.natrec is null
order by di.idlaf

 

Preciso atualizar o campo dic.natrec desses 353 registros. Fiz assim:

 

update ditemcompl set natrec = '105' 
from dlaf dl inner join ditem di on (dl.idlaf = di.idlaf)
left join ditemcompl dic on (dic.idlaf = di.idlaf and dic.numitem = di.numitem)
inner join tprd tp on (tp.idprd = di.idprd)
inner join dtrbitem dti on (dti.idlaf = di.idlaf and dti.numitem = di.numitem)
where tp.descricao like '%arroz%' and dl.tipolf = 'S'
and dl.dataemissao >= '2011/08/01' and dl.dataemissao <= '2011/08/31'
and dti.sittributaria  in ('04','06')
and dl.seriedoc in ('1','ECF') and dic.natrec is null

 

Atualizou apenas 196 registros. Ou seja como se a query buscasse apenas os idlaf (identificador do lanc. fiscal) sem o numitem que seriam os items do lançamento fiscal (totalizando 353 registros).

 

A forma como estou aplicando o update deve estar incorreta.

 

Se puderem dar uma força eu agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá victorpavia,

 

tenta dessa forma:

 

 

update dic set dic.natrec = '105' 
from dlaf dl inner join ditem di on (dl.idlaf = di.idlaf)
left join ditemcompl dic on (dic.idlaf = di.idlaf and dic.numitem = di.numitem)
inner join tprd tp on (tp.idprd = di.idprd)
inner join dtrbitem dti on (dti.idlaf = di.idlaf and dti.numitem = di.numitem)
where tp.descricao like '%arroz%' and dl.tipolf = 'S'
and dl.dataemissao >= '2011/08/01' and dl.dataemissao <= '2011/08/31'
and dti.sittributaria  in ('04','06')
and dl.seriedoc in ('1','ECF') and dic.natrec is null

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara te agradeço, mas ficou igual.

 

Vitor, creio que a diferença esta ocorrendo pois no select você usa como tabela principal dlaf e depois faz o LEFT na ditemcompl, e como sabemos os LEFT diferente do INNER não traz somente os registros que estão nas duas tabelas, já no update a tabela principal naturalmente é ditemcompl

 

tente refazer o select utilizando a tabela ditemcompl como principal, pois quando jogar no update os resultados serão os mesmos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eriva é isso mesmo.

Na verdade a atualização estava correta em parte. No caso a tabela que faço o left join precisa ser preenchida e não atualizada com o restante dos registros que faltaram.

 

Ou seja,

 

Se o registro existe na tabela ditemcompl é atualizado, caso contrário, é inserido.

 

Valew mais uma vez.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se o registro existe na tabela ditemcompl é atualizado, caso contrário, é inserido.

se estiver utilizando SQL Server 2008 verifique o comando MERGE, talvez seja útil nesse caso

 

abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.