Digamos que tenho a seguinte consulta.
SELECT ID, Email, ProductName, ProductModel FROM Products
Como posso modificá-lo para que ele não retorne e-mails duplicados?
Em outras palavras, quando várias linhas contêm o mesmo email, desejo que os resultados incluam apenas uma dessas linhas (de preferência a última). Duplicatas em outras colunas devem ser permitidas.
Cláusulas gostam DISTINCT
e GROUP BY
parecem funcionar em linhas inteiras. Portanto, não tenho certeza de como abordar isso.
sql
sql-server
Jonathan Wood
fonte
fonte
Respostas:
Se você estiver usando o SQL Server 2005 ou superior, use este:
EDIT: Exemplo usando uma cláusula where:
fonte
SELECT
precisa de umaWHERE
condição. Estou pensando que os números das linhas serão atribuídos a todas as linhas da tabela. Essa sintaxe está um pouco além de mim. Alguma chance de uma atualização que garanta uma linha com um email específico que atenda àWHERE
condição?JOIN
tenho s na minha consulta. Assim que eu tiver umJOIN
, o valorROW_NUMBER
retornará valores muito mais altos que "1".Isso pressupõe o SQL Server 2005+ e sua definição de "last" é a PK máxima para um determinado email
fonte
Quando você usa,
DISTINCT
pense nela como uma linha distinta, não como uma coluna. Ele retornará apenas linhas nas quais as colunas não coincidem exatamente da mesma forma.A consulta retornaria as duas linhas porque a
ID
coluna é diferente. Estou assumindo que aID
coluna é umaIDENTITY
coluna que está aumentando, se você quiser retornar a última, recomendo algo como isto:Ele
TOP 1
retornará apenas o primeiro registro, ordenando-o por ordemID
decrescente, retornará os resultados com a última linha primeiro. Isso lhe dará o último registro.fonte
Você pode superar isso usando a função GROUP BY
fonte
SELECT id, max(email) AS email FROM tbl GROUP by email
. No servidor SQL, TODAS as colunas daSELECT
cláusula devem estar em uma função agregada. Isso me morde toda vez que eu volto.Para o Access, você pode usar a consulta SQL Select que apresento aqui:
Por exemplo, você tem esta tabela:
CLIENTE || NOMBRES || ENVIAR
888 || T800 ARNOLD || [email protected]
123 || JOHN CONNOR || [email protected]
125 || SARAH CONNOR ||[email protected]
E você precisa selecionar apenas e-mails distintos. Você pode fazer isso com isso:
SQL SELECT:
Você pode usar isso para selecionar o ID máximo, o nome correspondente ao ID máximo, e pode adicionar qualquer outro atributo dessa maneira. Então, no final, você coloca a coluna distinta para filtrar e a agrupa apenas com a última coluna distinta.
Isso fornecerá o ID máximo com os dados correspondentes, você poderá usar min ou qualquer outra função e replicar essa função nas subconsultas.
Essa seleção retornará:
CLIENTE || NOMBRES || ENVIAR
888 || T800 ARNOLD || [email protected]
125 || SARAH CONNOR ||[email protected]
Lembre-se de indexar as colunas selecionadas e a coluna distinta não deve ter dados numéricos, todos em maiúsculas ou minúsculas; caso contrário, não funcionará. Isso funcionará com apenas um correio registrado também. Feliz codificação !!!
fonte
O motivo
DISTINCT
e oGROUP BY
trabalho em linhas inteiras é que sua consulta retorna linhas inteiras.Para ajudar você a entender: Tente escrever à mão o que a consulta deve retornar e você verá que é ambíguo o que colocar nas colunas não duplicadas.
Se você literalmente não se importa com o que está nas outras colunas, não as devolva. Retornar uma linha aleatória para cada endereço de email parece um pouco inútil para mim.
fonte
Tente isto
fonte
Tente o seguinte:
fonte