6

だから私はデータベーステーブルのいくつかの電話レコードをきれいにしようとしています.

以下を使用して、2 つのフィールドで完全一致を検索する方法を見つけました。

/* DUPLICATE first & last names */

SELECT 
    `First Name`, 
    `Last Name`, 
     COUNT(*) c 
FROM phone.contacts  
GROUP BY 
    `Last Name`, 
    `First Name` 
HAVING c > 1;

うわー、素晴らしい。

さらに拡張して、多数のフィールドを調べて、3 つの電話フィールドのうちの 1 つの電話番号が重複しているかどうかを確認します。

general mobileだから私は3つのフィールド( 、general phone、 )をチェックしたいbusiness phone

1. それらが空でないことを確認する ('') 2. それらのいずれかのデータ (数値) が、テーブル内の他の 2 つの電話フィールドに表示されるかどうかを確認します。

そのため、制限された SQL を限界を超えてプッシュすると、3 つの空の電話フィールドを持つレコードと、電話番号が重複していないレコードを返すように見える次のようになりました。

/* DUPLICATE general & business phone nos */

SELECT 
    id, 
   `first name`, 
   `last name`, 
   `general mobile`, 
   `general phone`, 
   `general email`, 
   `business phone`, 
    COUNT(CASE WHEN `general mobile` <> '' THEN 1 ELSE NULL END) as gen_mob, 
    COUNT(CASE WHEN `general phone` <> '' THEN 1 ELSE NULL END) as gen_phone,
    COUNT(CASE WHEN `business phone` <> '' THEN 1 ELSE NULL END) as bus_phone 
FROM phone.contacts 
GROUP BY 
   `general mobile`, 
   `general phone`, 
   `business phone` 
HAVING gen_mob > 1 OR gen_phone > 1 OR bus_phone > 1;

明らかに私の論理には欠陥があり、誰かが私を正しい方向に向けたり、同情したりできるかどうか疑問に思いました...

どうもありがとう

4

3 に答える 3

1

私の経験では、データをクリーンアップするときは、すべての分析を一度に実行する大きくてかさばるクエリを使用するよりも、データの包括的なビューとデータを管理する簡単な方法を用意する方がはるかに優れています。

次のようなものを使用して、(多かれ少なかれ) データベースを再正規化することもできます。

Create view VContactsWithPhones
as
Select id, 
       `Last Name` as LastName, 
       `First Name` as FirstName,
       `General Mobile` as Phone,
       'General Mobile' as PhoneType
From phone.contacts c
UNION
Select id, 
       `Last Name`, 
       `First Name`,
       `General Phone`,
       'General Phone'
From phone.contacts c
UNION
Select id, 
       `Last Name`, 
       `First Name`,
       `Business Phone`,
       'Business Phone'
From phone.contacts c

これにより、元のテーブルの 3 倍の行を含むビューが生成されますが、Phone列は 3 つのタイプのいずれかになります。

そのビューから簡単に選択できます。

//empty phones
SELECT * 
FROM VContactsWithPhones 
Where Phone is null or Phone = ''

//duplicate phones
Select Phone, Count(*)
from VContactsWithPhones 
where (Phone is not null and Phone <> '')  -- exclude empty values
group by Phone
having count(*) > 1

//duplicate phones belonging to the same ID (double entries)
Select Phone, ID, Count(*)
from VContactsWithPhones 
where (Phone is not null and Phone <> '')  -- exclude empty values
group by Phone, ID
having count(*) > 1

//duplicate phones belonging to the different ID (duplicate entries)
Select v1.Phone, v1.ID, v1.PhoneType, v2.ID, v2.PhoneType
from VContactsWithPhones v1
   inner join VContactsWithPhones v2 
     on v1.Phone=v2.Phone and v1.ID=v2.ID
where v1.Phone is not null and v1.Phone <> ''

などなど…

于 2013-08-15T11:51:04.080 に答える
0

次のようなものを試すことができます:

SELECT * from phone.contacts p WHERE `general mobile` IN (SELECT `general mobile` FROM phone.contacts WHERE id != p.id UNION SELECT `general phone` FROM phone.contacts WHERE id != p.id UNION SELECT `general email` FROM phone.contacts WHERE id != p.id)

general mobilegeneral phoneおよびのそれぞれについて 3 回繰り返しgeneral emailます。単一のクエリに入れることはできますが、読みにくくなります。

于 2013-08-15T11:16:59.790 に答える