2012-01-24 16 views
7

Sto cercando la risposta su come la clausola DISTINCT funziona in SQL (SQL Server 2008 se questo fa la differenza) su una query con più tabelle unite?In che modo la clausola DISTINCT di SQL funziona?

Intendo come il motore SQL gestisce la query con la clausola DISTINCT?

Il motivo che sto chiedendo è che il mio collega di gran lunga più esperto mi ha detto che SQL applica DISTINCT a ogni campo di ogni tavolo. Sembra improbabile per me, ma voglio fare in modo ....

Per esempio avere due tabelle:

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) 
) 

E poi avere questa query:

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 

Supponendo c'era utente con due ruoli, la query sopra restituirà due record con lo stesso nome utente.

Ma questa domanda 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 

restituirà un solo nome utente.

La domanda è se SQL confronterà tutti i campi di tutte le tabelle unite (u_id, u_name, u_password, r_id, r_name) o confronterà solo i campi con nome nella query (u_name) e distinguerà i risultati?

+0

Si consiglia di esaminare il piano di spiegazioni su come il motore SQL decide di gestire la sintassi. – Randy

risposta

13

DISTINCT filtra i valori duplicati dei campi restituiti.

Un modo davvero semplificato per vedere le cose è:

  • costruisce il set complessiva risultato (compresi i duplicati), sulla base di FROM e WHERE clausole
  • Si ordina che set di risultati in base ai campi vuole tornare
  • rimuove tutti i valori duplicati in quei campi

E 'equivalente alla GROUP BY dove tutti i campi restituiti sono nella clausola GROUP BY.

+1

Ho imparato tutto questo facendo ora, facendo un errore come mostrato qui - http://stackoverflow.com/questions/20750181/count-with-distinct Infine, ho finito per utilizzare GROUP BY invece di DISTINCT. – Steam

3

DISTINCT semplicemente deduplica il recordset risultante dopo che tutte le altre operazioni di query sono state eseguite. This article ha più dettagli.

0

Prima seleziona tutti i "record disponibili" e quindi "rimuove i record duplicati" in tutti i "record disponibili" e stampa.

Problemi correlati