2012-01-24 31 views
7

Estoy buscando la respuesta sobre cómo funciona la cláusula DISTINCT en SQL (SQL Server 2008 si eso hace la diferencia) en una consulta con varias tablas unidas?¿Cómo funciona la cláusula DISTINCT de SQL?

Me refiero a cómo el motor SQL maneja la consulta con la cláusula DISTINCT?

La razón por la que estoy preguntando es que mi colega más experimentado me dijo que SQL aplica DISTINCT en todos los campos de todas las tablas. Parece poco probable para mí, pero yo quiero para asegurarse ....

Por ejemplo tener dos tablas:

CREATE TABLE users 
(
u_id INT PRIMARY KEY, 
u_name VARCHAR(30), 
u_password VARCHAR(30) 
) 

CREATE TABLE roles 
(
r_id INT PRIMARY KEY, 
r_name VARCHAR(30) 
) 

CREATE TABLE users_l_roles 
(
u_id INT FOREIGN KEY REFERENCES users(u_id) , 
r_id INT FOREIGN KEY REFERENCES roles(r_id) 
) 

y luego tener esta consulta:

SELECT   u_name 
FROM   users 
INNER JOIN  users_l_roles ON users.u_id = users_l_roles.u_id 
INNER JOIN  roles ON users_l_roles.r_id = roles.r_id 

Suponiendo que no era usuario con dos roles, la consulta anterior devolverá dos registros con el mismo nombre de usuario.

Pero esta consulta con distinta:

SELECT DISTINCT u_name 
FROM   users 
INNER JOIN  users_l_roles ON users.u_id = users_l_roles.u_id 
INNER JOIN  roles ON users_l_roles.r_id = roles.r_id 

volverá solamente un nombre de usuario.

La pregunta es si SQL comparará todos los campos de todas las tablas unidas (u_id, u_name, u_password, r_id, r_name) o solo comparará los campos con nombre en la consulta (u_name) y distinguirá los resultados?

+0

you shuold examine el plan de explicación de cómo su motor SQL decide manejar su sintaxis. – Randy

Respuesta

13

DISTINCT filtra los valores duplicados de sus campos devueltos .

Una forma muy simplificada a verlo es:

  • se construye su conjunto de resultados en general (incluyendo los duplicados) en base a sus FROM y WHERE cláusulas
  • Se ordena que el conjunto de resultados sobre la base de los campos que querrá volver
  • Suprime los valores duplicados en esos campos

Es semánticamente equivalente a un GROUP BY donde todos los campos devueltos están en la cláusula GROUP BY.

+1

Aprendí todo esto haciendo ahora, cometiendo un error como se muestra aquí - http://stackoverflow.com/questions/20750181/count-with-distinct Finalmente, terminé usando GROUP BY en lugar de DISTINCT. – Steam

3

DISTINCT simplemente quita la duplicación del conjunto de registros resultante después de que se hayan realizado todas las demás operaciones de consulta. This article tiene más detalles.

0

Primero selecciona todos los 'registros disponibles' y luego 'elimina registros duplicados' en todos los 'registros disponibles' e impresiones.