2016-11-29 38 views
0

我有一個具有兩列empid(主鍵)名稱的表員工。假設它有三行以下。SQL select語句避免基於主鍵的重複行

EmpID Name 
--------------- 
11  Name1 
12  Name2 
11  Name3 

我該如何編寫select語句來選擇記錄,以避免重複empid的兩行。我使用的查詢,如:

select empid, name 
from(select empid, name, row_number() over(partition by empid order by empid desc) rnk 
    from t)a 
where a.rnk=1 

但這個查詢將給

EmpID Name 
--------------- 
11  Name1 
12  Name2 

作爲結果。但我需要的是

EmpID Name 
--------------- 
12  Name2 
+4

那麼,如果empid是一個主鍵,你怎麼有重複值呢? –

+0

只需更改'count()'的'row_number()',你就可以得到你需要的結果。 – GarethD

回答

0

嘗試此查詢,這將工作,給你排12名2

選擇EMPID,從員工的名字 加入( 選擇EMPID,具有EMPID 計數(EMPID)爲COUNT1從員工 組計數(EMPID)= 1)上a.empid = b.empid

0

會不會SELECT max(empid) as empid, name from employee group by name having count(distinct empid) < 2工作?

0
select empid, name 
from(select empid, name,count(*) over(partition by empid) cnt from t) t 
where cnt=1 
0

一種anti join使用NOT EXISTS b可能是最快的方法:

SELECT empID, Name 
FROM T 
WHERE NOT EXISTS (SELECT 1 FROM T AS T2 WHERE T2.EmpID = T.EmpID AND T2.Name <> T.Name); 

我沒有做過任何測試,所以優化器可能能夠使用count = 1操作生成反半聯接,但這樣可以使其達到該計劃的最佳機會。

+1

我們都會忽略PK列中存在重複值時出現錯誤的事實嗎?首先不應該需要這個SQL字符串。或者我錯了? –

+0

我已經結束了這個事實,因爲它似乎不是回答手邊的問題 - 「我將如何編寫一個選擇語句來選擇記錄,避免重複empid的兩行」* - 是的,這是一件重要的事情指出並且我已經提高了你的評論,但它並沒有改變問題的實際問題的解決方案。爲了提供幫助,儘管代表提問者可能存在誤解,但我發佈瞭解決方案。 – GarethD