Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como removo linhas duplicadas de uma exibição?


DISTINCT não o ajudará se as linhas tiverem colunas diferentes. Obviamente, uma das tabelas às quais você está unindo tem várias linhas para uma única linha em outra tabela. Para obter uma linha de volta, você deve eliminar as outras várias linhas na tabela à qual está se juntando.

A maneira mais fácil de fazer isso é aprimorar sua cláusula where ou restrição JOIN para ingressar apenas no registro único que você deseja. Normalmente, isso requer a determinação de uma regra que sempre selecionará a entrada 'correta' da outra tabela.

Vamos supor que você tenha um problema simples como este:
Person:  Jane
Pets: Cat, Dog

Se você criar uma junção simples aqui, receberá dois registros para Jane:
Jane|Cat
Jane|Dog

Isso está completamente correto se o ponto de vista for listar todas as combinações de pessoas e animais de estimação. No entanto, se sua visualização deveria listar pessoas com animais de estimação ou listar pessoas e exibir um de seus animais de estimação, você atingiu o problema que tem agora. Para isso, você precisa de uma regra.
SELECT Person.Name, Pets.Name
FROM Person
  LEFT JOIN Pets pets1 ON pets1.PersonID = Person.ID
WHERE 0 = (SELECT COUNT(pets2.ID) 
             FROM Pets pets2
             WHERE pets2.PersonID = pets1.PersonID
                AND pets2.ID < pets1.ID);

O que isso faz é aplicar uma regra para restringir o registro de Pets na junção ao Pet com o ID mais baixo (primeiro na tabela Pets). A cláusula WHERE essencialmente diz "onde não há animais de estimação pertencentes à mesma pessoa com um valor de ID menor).

Isso produziria um resultado de um registro:
Jane|Cat

A regra que você precisará aplicar à sua visualização dependerá dos dados nas colunas que você possui e quais dos 'vários' registros devem ser exibidos na coluna. No entanto, isso acabará ocultando alguns dados, que podem não ser o que você deseja. Por exemplo, a regra acima oculta o fato de Jane ter um Cachorro. Faz parecer que Jane só tem um gato, quando isso não está correto.

Talvez seja necessário repensar o conteúdo de sua exibição e o que você está tentando realizar com sua exibição, se estiver começando a filtrar dados válidos.