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 DISTINCT
y GROUP BY
parecen 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
SELECT
necesita unaWHERE
condició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 laWHERE
condición?JOIN
s en mi consulta. Tan pronto como tengo unJOIN
, elROW_NUMBER
devuelve 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,
DISTINCT
piense 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
ID
columna es diferente. Supongo que laID
columna es unaIDENTITY
columna que se está incrementando, si desea devolver la última, le recomiendo algo como esto:El
TOP 1
devolverá sólo el primer registro, ordenando que elID
descendente 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 laSELECT
clá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
DISTINCT
y elGROUP BY
trabajo 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