Digamos que tengo la siguiente consulta.
SELECT ID, Email, ProductName, ProductModel FROM Products
¿Cómo puedo modificarlo para que no devuelva correos electrónicos duplicados?
En otras palabras, cuando varias filas contienen el mismo correo electrónico, quiero que los resultados incluyan solo una de esas filas (preferiblemente la última). Se deben permitir duplicados en otras columnas.
Las cláusulas tienen gusto DISTINCTy GROUP BYparecen funcionar en filas enteras. Así que no estoy seguro de cómo abordar esto.
sql
sql-server
Jonathan Wood
fuente
fuente

Respuestas:
Si está utilizando SQL Server 2005 o superior, use esto:
EDITAR: Ejemplo usando una cláusula where:
fuente
SELECTnecesita unaWHEREcondición. Estoy pensando que los números de fila se asignarán a todas las filas de la tabla. Esta sintaxis está un poco más allá de mí. ¿Alguna posibilidad de una actualización que garantice una fila con un correo electrónico en particular que cumpla con laWHEREcondición?JOINs en mi consulta. Tan pronto como tengo unJOIN, elROW_NUMBERdevuelve valores mucho más altos que "1".Esto asume SQL Server 2005+ y su definición de "último" es la PK máxima para un correo electrónico dado
fuente
Cuando lo use,
DISTINCTpiense en él como una fila distinta, no como una columna. Solo devolverá filas donde las columnas no coincidan exactamente igual.La consulta devolvería ambas filas porque la
IDcolumna es diferente. Supongo que laIDcolumna es unaIDENTITYcolumna que se está incrementando, si desea devolver la última, le recomiendo algo como esto:El
TOP 1devolverá sólo el primer registro, ordenando que elIDdescendente que devolverá los resultados de la última fila en primer lugar. Esto te dará el último registro.fuente
Puede superar eso usando la función GROUP BY
fuente
SELECT id, max(email) AS email FROM tbl GROUP by email. En el servidor SQL, TODAS las columnas de laSELECTcláusula deben estar en una función agregada. Esto me muerde cada vez que regreso.Para Access, puede usar la consulta SQL Select que presento aquí:
Por ejemplo, tienes esta tabla:
CLIENTE || NOMBRES || CORREO
888 || T800 ARNOLD || [email protected]
123 || JOHN CONNOR || [email protected]
125 || SARAH CONNOR ||[email protected]
Y solo debe seleccionar correos distintos. Puedes hacerlo con esto:
SQL SELECT:
Puede usar esto para seleccionar la ID máxima, el nombre correspondiente a esa ID máxima, puede agregar cualquier otro atributo de esa manera. Luego, al final, coloca la columna distinta para filtrar y solo la agrupa con esa última columna distinta.
Esto le proporcionará la ID máxima con los datos correspondientes, puede usar min o cualquier otra función y replica esa función en las subconsultas.
Esta selección devolverá:
CLIENTE || NOMBRES || CORREO
888 || T800 ARNOLD || [email protected]
125 || SARAH CONNOR ||[email protected]
Recuerde indexar las columnas que seleccione y la columna distinta no debe tener datos numéricos en mayúsculas o minúsculas, de lo contrario no funcionará. Esto también funcionará con un solo correo registrado. Feliz codificación !!!
fuente
La razón
DISTINCTy elGROUP BYtrabajo en filas enteras es que su consulta devuelve filas enteras.Para ayudarlo a comprender: Intente escribir a mano lo que debería devolver la consulta y verá que es ambiguo qué poner en las columnas no duplicadas.
Si literalmente no le importa lo que hay en las otras columnas, no las devuelva. Devolver una fila aleatoria para cada dirección de correo electrónico me parece un poco inútil.
fuente
Prueba esto
fuente
Prueba esto:
fuente