APAGAR REGISTROS DE UMA TABELA COM DUPLICIDADE

EDUARDONICE 29/01/2015 16:07:51
#444114
Boa tarde

Acredito que a minha dúvida seja fácil de resolver porque não tenho muita experiência com SQL.
Preciso apagar os registros da tabela chamada Estoque (Chave Primária: Filial, Produto, Local), deixando apenas um produto por filial e por local. Não importa qual seja o local.

Exemplo: A tabela Estoque está assim:

FILIAL PROD LOCAL QUANT
1 1 3 10
1 1 5 20
1 2 5 20
1 3 3 12
1 3 5 18
1 3 8 29
2 3 5 12
3 3 3 3
3 3 5 5

E precisa ficar assim:

FILIAL PROD LOCAL QUANT
1 1 3 10
1 2 5 20
1 3 3 12
2 3 5 12
3 3 3 3

Fiz um select que identifica quais são os produtos da filial que tem mais que uma entrada:
Select PRODUTO, COUNT(*)
From Estoque
Where FILIAL = 1
GROUP BY PRODUTO
HAVING COUNT(*) > 1

que produziu o seguinte resultado
PROD (Nenhum nome de coluna)
1 2
3 3

mas como faço para apagar deixando apenas um produto por filial e local???
TUNUSAT 29/01/2015 16:56:07
#444118
Resposta escolhida
EDUARDONICE,

Não consegui fazer o que você quer, mas fiz algo que talvez seja metade do caminho ... talvez te ajude.
Eu isolei os caras que podem ficar assim:
SELECT Filial, Produto, Max(Local), Max(Quantidade)
FROM ESTOQUE
GROUP BY Filial, Produto


Agora ao tentar selecionar o que você NÃO quer (substituir 1º SELECT por DELETE) pela fórmula [Ô]NOT EXISTS[Ô] não retornou nada ... não sei onde errei ...
select E1.Filial, E1.Produto, Max(E1.Local), Max(E1.Quantidade)
from Estoque E1
where NOT EXISTS
(SELECT E2.Filial, E2.Produto, Max(E2.Local), Max(E2.Quantidade)
FROM ESTOQUE E2
GROUP BY E2.Filial, E2.Produto)
GROUP BY E1.Filial, E1.Produto;


Espero que te ajude um pouco...

[][ô]s,
Tunusat.
EDUARDONICE 29/01/2015 20:05:16
#444121
Ola Tunusat

Vou aguardar para ver se vem uma nova sugestão

Estou tentando por aqui e também ainda não consegui nenhum resultado, mas vou pensar a respeito da idéia que você deu. De qualquer forma, obrigado por enquanto.
MILENIO 29/01/2015 22:39:40
#444122
Penso que precisa ler a tabela Original em ordem de Filial, Produto, Local.
Gravar uma nova tabela utilizando comparações.
Não vou colocar o código porque não sei se, por exemplo:
FILIAL PROD LOCAL QUANT
1 1 3 10
1 1 5 20

O local 5 vai desaparecer. As quantidades do local 5 serão incorporados ao local 2 ? Ou serão desprezadas ?
TUNUSAT 30/01/2015 08:12:13
#444135
EDUARDONICE,

Opa!
Por favor, pode verificar?
Será que conseguimos?

SELECT E1.Filial, E1.Produto, E1.Local, E1.Quantidade
FROM ESTOQUE E1
EXCEPT
SELECT E2.Filial, E2.Produto, Max(E2.Local), Max(E2.Quantidade)
FROM ESTOQUE E2
GROUP BY E2.Filial, E2.Produto


Veja também:
==================================================
EXCEPT e INTERSECT (Transact-SQL)
https://msdn.microsoft.com/pt-br/library/ms188055.aspx
==================================================

[][ô]s,
Tunusat.
EDUARDONICE 30/01/2015 11:11:40
#444141
Ainda não funcionou... Ao executar a query obtive dois produtos em locais diferentes na mesma filial (Filial 1 Produto 3 Locais 3 e 5 e só deveria estar em um local):

Filial Prod Local Quant
1 1 3 10
1 3 3 12
1 3 5 18
3 3 3 3
TUNUSAT 30/01/2015 13:28:49
#444143
Mas EDUARDONICE,

Deixa ver seu eu entendi!
Estas são as linhas que NÃO serão apagadas (NÃO tem duplicidade):

=========================================
SELECT E2.Filial, E2.Produto, Max(E2.Local), Max(E2.Quantidade)
FROM ESTOQUE E2
GROUP BY E2.Filial, E2.Produto
=========================================
Filial Prod Local Quant
1 1 5 20
1 2 5 20
1 3 8 29
2 3 5 12
3 3 5 5
=========================================

Estas serão as linhas que serão apagadas (tem duplicidade, mas não faz diferença):

=========================================
SELECT E1.Filial, E1.Produto, E1.Local, E1.Quantidade
FROM ESTOQUE E1
EXCEPT
SELECT E2.Filial, E2.Produto, Max(E2.Local), Max(E2.Quantidade)
FROM ESTOQUE E2
GROUP BY E2.Filial, E2.Produto
=========================================
Filial Prod Local Quant
1 1 3 10
1 3 3 12
1 3 5 18
3 3 3 3
=========================================

E para apagar é preciso pegar o resultado da consulta e apagar...
... mas abaixo não está fazendo isso (está apagando TUDO):

=========================================
BEGIN TRANSACTION
GO

DELETE
FROM ESTOQUE
WHERE EXISTS (
SELECT E1.Filial, E1.Produto, E1.Local, E1.Quantidade
FROM ESTOQUE E1
EXCEPT
SELECT E2.Filial, E2.Produto, Max(E2.Local), Max(E2.Quantidade)
FROM ESTOQUE E2
GROUP BY E2.Filial, E2.Produto)
GO

-- ROLLBACK TRANSACTION
-- GO
=========================================
(9 row(s) affected)
=========================================

[][ô]s,
Tunusat.
EDUARDONICE 30/01/2015 18:52:10
#444152
Você tem razão Tunusat.

Depois que eu havia respondido é que percebi o meu erro.

Cheguei na mesma query de deleção que você mandou, porém também não entendo porque está apagando tudo.

Vou continuar tentando...
Tópico encerrado , respostas não são mais permitidas