[英]SQL: Find non-unique records in one column that are also non-unique in another column
我有一個地方及其地區的表格,但有時在同一地區有不止一個同名的地方。 現實生活中的例子: 威斯康星州有五個斯普林菲爾德 。 我居住的新斯科舍省有三個桑迪海灣 。 我需要找到這些類型的記錄並消除它們的歧義(例如,通過添加它們的縣或等價物)或者只刪除垃圾/重疊的記錄。 這需要一些工作,但首先我想看看有多少工作。
PlaceName: RegionName:
Summerville Big State
Summerville Bigger State (OK, different states, no problem...)
Summerville Little State <-
Summerville Little State <- I need to deal with these
這個查詢基於另一個問題的答案 ,讓我得到了所有具有相同名稱的地方:
SELECT * FROM Places WHERE PlaceName IN
(SELECT PlaceName FROM Places GROUP BY PlaceName HAVING COUNT(*) > 1);
這是一個好的開始,但我想跳過在同一狀態下不會出現多次的名稱,直接解決問題情況。 一般來說,我想在一列中找到非唯一記錄,並從那里獲得另一列中不唯一的記錄。
(FWIW,我使用的是MariaDB,它主要與MySQL兼容。)
基本上你想要
所以,讓我們這樣做吧
SELECT
PlaceName, RegionName, Count(*) AS num
FROM Places
GROUP BY CONCAT(PlaceName,':::',RegionName)
HAVING COUNT(*)>1
要做到這一點的方法之一是用join
到匯總列表。 您需要按地區和地點進行匯總才能獲得所需的列表:
SELECT p.*, rp.cnt
FROM Places p join
(SELECT RegionName, PlaceName, COUNT(*) as cnt
FROM Places
GROUP BY RegionName, PlaceName
HAVING COUNT(*) > 1
) rp
on p.RegionName = rp.RegionName and p.PlaceName = rp.PlaceName;
您沒有提到您正在使用的實際數據庫。 還有其他方法來表達這一點,有些方法依賴於數據庫。
我想你可以只連接列:
SELECT * FROM Places WHERE PlaceName + RegionName IN
(SELECT PlaceName + RegionName FROM Places GROUP BY PlaceName + RegionName HAVING COUNT(*) > 1);
如果我錯了,我相信其他StackOverflowers會讓我知道! :d
我不確定,但它似乎只是兩個領域的簡單組合
select PlaceName , RegionName
from Places
group by PlaceName , RegionName
having count(*) >1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.