2014-10-16 44 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

相關問題