簡體   English   中英

SQL:在一列中查找非唯一記錄,這些記錄在另一列中也是非唯一的

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM