2

次のようなテーブルで重複する顧客を見つけようとしています。

customer_id | first_name | last_name 
-------------------------------------
          0 | Rich       | Smith
          1 | Paul       | Jones
          2 | Richard    | Smith
          3 | Jimmy      | Roberts

この状況では、customer_id 0 と customer_id 2 を返すクエリが必要です。このクエリでは、顧客が自分の名前を短縮した可能性がある一致を検索する必要があります。たとえば、Richard ではなく Rich、Robert ではなく Rob です。

私はこのクエリを持っていますが、一致の 1 つ (両方ではない) のみを返しています。クエリで返される Rich と Richard の両方が必要です。

select distinct customers.customer_id, concat(customers.first_name,' ',customers.last_name) as name from customers
inner join customers dup on customers.last_name = dup.last_name
where (dup.first_name like concat('%', customers.first_name, '%')
and dup.customer_id <> customers.customer_id )
order by name

誰かが私を正しい方向に向けることができますか?

@tsOverflow ごとに、これは私の問題を解決した最終的なクエリです:

select distinct customers.customer_id, concat(customers.first_name,' ',customers.last_name) as name 
from customers
    inner join customers dup on customers.last_name = dup.last_name
where ((dup.first_name like concat('%', customers.first_name, '%') 
            OR (customers.first_name like concat('%', dup.first_name, '%')) 
        )
    and dup.customer_id <> customers.customer_id )
order by name

上記のソリューションには、パフォーマンスの問題がある可能性があります。

4

1 に答える 1

1

あなたの問題は、リッチがリチャードの部分文字列であるためですが、その逆ではないためです。

これにより、両方の方法がチェックされます。

select distinct randomtest.customer_id, concat(randomtest.first_name,' ',randomtest.last_name) as name 
from randomtest
    inner join randomtest dup on randomtest.last_name = dup.last_name
where ((dup.first_name like concat('%', randomtest.first_name, '%') 
            OR (randomtest.first_name like concat('%', dup.first_name, '%')) 
        )
    and dup.customer_id <> randomtest.customer_id )
order by name

OR を追加して、その逆のチェックを行います。クエリで like ステートメントを使用すると、パフォーマンスに影響があることに注意してください。私はこれについて専門家ではなく、単なる考えです。

編集:他の人がコメントで述べたように-これは、「短縮」バージョンが実際には単なる部分文字列である場合のみをキャッチし、マイケル -> マイク、またはウィリアム -> ビル、およびジョンと一部の男のケースをキャッチしませんジョンソンという名前も、2人のまったく異なる人物かもしれません。

于 2012-04-09T20:25:04.173 に答える