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?
Si consiglia di esaminare il piano di spiegazioni su come il motore SQL decide di gestire la sintassi. – Randy