APAGAR REGISTROS DE UMA TABELA COM DUPLICIDADE
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???
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???
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:
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 ...
Espero que te ajude um pouco...
[][ô]s,
Tunusat.
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.
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.
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.
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 ?
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 ?
EDUARDONICE,
Opa!
Por favor, pode verificar?
Será que conseguimos?
Veja também:
==================================================
EXCEPT e INTERSECT (Transact-SQL)
https://msdn.microsoft.com/pt-br/library/ms188055.aspx
==================================================
[][ô]s,
Tunusat.
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.
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
Filial Prod Local Quant
1 1 3 10
1 3 3 12
1 3 5 18
3 3 3 3
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.
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.
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...
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