2014-09-29 58 views
1

我有一個問題,看起來很簡單,但我無法弄清楚。在Oracle SQL中查找不唯一的行

我有不便如下:

Name Zipcode 

    ER 5354 
    OL 1234 
    AS 1234 
    BH 3453 
    BH 3453 
    HZ 1234 

我想找到其中ID沒有明確界定一個行的行。

所以在這裏我要見:

OL 1234 
    AS 1234 
    HZ 1234 

或簡單地郵政編碼足夠多。

對不起,我忘了提及一個重要的部分。如果名稱相同,則只有在相同郵政編碼有不同名稱時纔是問題。 所以這意味着:BH 3453不返回

+6

「HZ 1234」怎麼樣?爲什麼你的例子中沒有返回這一行? – 2014-09-29 14:06:10

+0

sry我的錯,它應該返回 – Csanesz 2014-09-29 14:13:34

+1

@Csanesz我已根據您的更新更新了查詢 – 2014-09-29 14:30:33

回答

3

我想這是你想要的

select zipcode 
from yourTable 
group by zipcode 
having count(*) > 1 

它選擇相關聯的多個記錄

的郵編回答你更新的問題:

select zipcode 
from 
(
    select name, zipcode 
    from yourTable 
    group by name, zipcode 
) 
group by zipcode 
having count(*) > 1 

應該這樣做。

select yt.* 
    from YOUR_TABLE yt 
    , (select zipcode 
      from YOUR_TABLE 
     group by zipcode 
     having count(*) > 1 
     ) m 
where yt.zipcode = m.zipcode 
+0

請小心使用名稱'table',例如,但在這種情況下使用其他名稱或使用反引號。 +1爲解決方案 – 2014-09-29 14:16:18

+0

@JoëlSalamin感謝您發現此問題,我已更新查詢 – 2014-10-20 08:10:12

1

試試這個可能不是在性能方面在這種情況下,你可以使用窗口功能優化。對於所有列,基於窗口函數的解決方案應該優於自加入方法:

SELECT a.zipcode, a.name 
FROM 
(
    SELECT zipcode, name, count(1) over(partition by zipcode) as cnt 
    FROM your_table 
)a 
WHERE a.cnt >1 
2

如果你只需要郵政編碼,使用VC 74的解決方案:通過@的建議a1ex07

+0

優於自我加入,但與單純使用聚合函數相比,性能不佳FIRST和LAST – 2014-09-29 14:23:01