2012-01-24 27 views
7

我正在尋找DISTINCT子句在SQL中的工作原理(SQL Server 2008如果這有所作爲)在多個表連接的查詢上的答案?SQL的DISTINCT子句如何工作?

我指的是SQL引擎如何處理與DISTINCT子句的查詢?

的原因,我問的是,我被我更有經驗的同事告訴記者,SQL DISTINCT適用於每個表的各個領域。這似乎不太可能,但我要確保....

例如有兩個表:

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

,然後有此查詢:

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 

假設有用戶有兩個角色,那麼上述查詢將返回兩個具有相同用戶名的記錄。

但此查詢具有鮮明:

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 

將返回只有一個用戶名。

問題是SQL是否會比較所有連接表(u_id,u_name,u_password,r_id,r_name)中的所有字段,還是隻比較查詢中的命名字段(u_name)並區分結果?

+0

你shuold檢查你的SQL引擎決定如何處理你的語法解釋計劃。 – Randy

回答

13

DISTINCT篩選出您的返回的字段的重複值。

看它

一個非常簡單的方法是:

  • 它建立你的整體結果設置基於FROMWHERE條款(包括重複)
  • 它排序依據的字段,你該結果集想回到
  • 它在這些領域

這是語義上等同於一個刪除任何重複的值10所有返回的字段都在GROUP BY條款中。所有其他的查詢操作已執行後

+1

我通過現在製作了一個這樣的錯誤,如下所示:http://stackoverflow.com/questions/20750181/count-with-distinct最後,我結束了使用GROUP BY而不是DISTINCT。 – Steam

0

首先選擇所有「可用記錄」,然後將其「刪除重複的記錄」在所有「可用記錄」,並打印。