Eu tenho uma tabela de banco de dados PostgreSQL chamada "user_links" que atualmente permite os seguintes campos duplicados:
year, user_id, sid, cid
A única restrição é atualmente o primeiro campo chamado "id", porém agora estou olhando para adicionar uma restrição para garantir que o year
, user_id
, sid
e cid
são todos originais, mas não posso aplicar a restrição, porque valores duplicados já existem que violar esta restrição.
Existe uma maneira de encontrar todas as duplicatas?
sql
postgresql
duplicates
John
fonte
fonte
Respostas:
A ideia básica será usar uma consulta aninhada com agregação de contagem:
Você pode ajustar a cláusula where na consulta interna para restringir a pesquisa.
Há outra boa solução para a mencionada nos comentários (mas nem todos os lêem):
Ou mais curto:
fonte
select co1, col2, count(*) from tbl group by col1, col2 HAVING count(*)>1
Em " Encontre linhas duplicadas com o PostgreSQL ", aqui está a solução inteligente:
fonte
SELECT * FROM ( SELECT *, LEAD(row,1) OVER () AS nextrow FROM ( SELECT *, ROW_NUMBER() OVER(w) AS row FROM tbl WINDOW w AS (PARTITION BY col1, col2 ORDER BY col3) ) x ) y WHERE row > 1 OR nextrow > 1;
ROW_NUMBER()
porCOUNT(*)
e adicionarrows between unbounded preceding and unbounded following
depois #ORDER BY id asc
DELETE ...USING
e alguns pequenos ajustesVocê pode ingressar na mesma tabela nos campos que seriam duplicados e depois ingressar no campo de identificação. Selecione o campo de identificação no primeiro alias da tabela (tn1) e use a função array_agg no campo de identificação do segundo alias da tabela. Por fim, para que a função array_agg funcione corretamente, você agrupará os resultados pelo campo tn1.id. Isso produzirá um conjunto de resultados que contém o ID de um registro e uma matriz de todos os IDs que atendem às condições de junção.
Obviamente, os IDs que estarão na matriz duplicate_entries para um ID também terão suas próprias entradas no conjunto de resultados. Você precisará usar esse conjunto de resultados para decidir qual ID deseja tornar a fonte de 'verdade'. O único registro que não deve ser excluído. Talvez você possa fazer algo assim:
Seleciona os IDs de número mais baixo duplicados (assumindo que o ID esteja aumentando em PK). Esses seriam os IDs que você manteria por perto.
fonte
Para facilitar, presumo que você deseja aplicar uma restrição exclusiva apenas para o ano da coluna e a chave primária é uma coluna chamada id.
Para encontrar valores duplicados, você deve executar,
Usando a instrução sql acima, você obtém uma tabela que contém todos os anos duplicados em sua tabela. Para excluir todas as duplicatas, exceto a última entrada duplicada, você deve usar a instrução sql acima.
fonte