2014-10-16 55 views
0

举例来说,我有下面的表:使用功能分组时,可以使用同一表中的连接吗?

pk_id,address,first_name,last_name 

,我有这样一个查询,显示的第一个名字ANS是重复(重复)的姓氏

select first_name,last_name 
from table 
group by first_name,last_name 
having count(*)>1; 

但上面的查询只是返回姓氏和名字,但我想显示pk_id和地址,这些绑定到这些重复的名字和姓氏 我们可以使用连接在同一张桌子上做到这一点。请帮助!

回答

0

你必须从外部查询调用它,就像这样:

select * from table 
where first_name||last_name in 
    (select first_name||last_name from 
     (select first_name, last_name, count(*) 
     from table 
     group by first_name,last_name 
     having count(*) > 1 
     ) 
    ) 

注意:您可能不会需要连接的2场,但我没有测试过这一点。

+1

字符串连接伎俩可能会产生不正确的结果对于一些数据。例如,'FRANK'|| 'AFKA'='FRAN'|| “KAFKA''。 – 2014-10-16 19:38:07

+0

确实如此。你想添加一个空间来避免这种情况,就像在first_name ||' “||姓氏。谢谢你的收获。 – JohnFL 2014-10-16 20:58:22

+1

你可以使用这个条件:(first_name,last_name)in(select first_name,last_name ...' – 2014-10-17 05:29:03

0
with 
    my_duplicates as 
    (
    select 
     first_name, 
     last_name 
    from 
     my_table 
    group by 
     first_name, 
     last_name 
    having 
     count(*) > 1 
) 
select 
    bb.pk_id, 
    bb.address, 
    bb.first_name, 
    bb.last_name 
from 
    my_duplicates aa 
    join my_table bb on 
    (
    aa.first_name = bb.first_name 
    and 
    aa.last_name = bb.last_name 
) 
order by 
    bb.last_name, 
    bb.first_name, 
    bb.pk_id 
1

一个简单的方法是建立一个与pk_id和重复计数的视图。一旦你拥有了它,它只是用在基表JOIN的事,一个过滤器,只保留有一个重复的行:

SELECT T.* 
FROM T 
JOIN (SELECT "pk_id", 
     COUNT(*) OVER(PARTITION BY "first_name", "last_name") cnt 
     FROM T) V 
ON T."pk_id" = V."pk_id" 
WHERE cnt > 1 

http://sqlfiddle.com/#!4/3ecd0/9

相关问题