2016-11-29 39 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