2011-02-28 10 views
1

私は2つのSQL2008テーブルを持っています.1つは新しいデータを含む "インポート"テーブルで、もう1つはライブデータを持つ "デスティネーション"テーブルです。両方のテーブルは類似していますが、同一ではありません(CRMシステムによって更新された宛先テーブルにはさらに多くの列があります)が、両方のテーブルにはTel1、Tel2、Tel3の3つの「電話番号」フィールドがあります。電話番号のが既に宛先テーブルに存在するインポートテーブルからすべてのレコードを削除する必要があります。2つのテーブル間で重複を見つける

私は(今でテストするだけでSELECT)単純なクエリ一緒にノックしようとしました:

select t2.account_id 
from ImportData t2, Destination t1 
where 
(t2.Tel1!='' AND (t2.Tel1 IN (t1.Tel1,t1.Tel2,t1.Tel3))) 
or 
(t2.Tel2!='' AND (t2.Tel2 IN (t1.Tel1,t1.Tel2,t1.Tel3))) 
or 
(t2.Tel3!='' AND (t2.Tel3 IN (t1.Tel1,t1.Tel2,t1.Tel3))) 

を...しかし、私は、これはほぼ確実に物事を行う方法ではありません注意してくださいよ、特にそれは非常に遅いです。誰かが私を正しい方向に向けることができますか?

答えて

1

をテーブルを削除...

;with aaa(tel) 
as 
(
select Tel1 
from Destination 
union 
select Tel2 
from Destination 
union 
select Tel3 
from Destination 
) 
,bbb(tel, id) 
as 
(
select Tel1, account_id 
from ImportData 
union 
select Tel2, account_id 
from ImportData 
union 
select Tel3, account_id 
from ImportData 
) 

select distinct b.id 
from bbb b 
where b.tel in 
(
select a.tel 
from aaa a 
intersect 
select b2.tel 
from bbb b2 
) 
+0

感謝 - これはすばらしい、非常に速く働き、私は実際にそれが何をするのか理解しています:) – KenD

+0

私はこの質問から少し余分なものを絞るためにすべての組合のためにそれを変更するでしょう:) – luckyluke

1

存在すると、クエリが短絡し、結合のようにテーブルが完全に走査されません。これでもあなたが望むやり方を実行できない場合は、where節をリファクタリングすることができます。

SELECT * 
FROM ImportData t2 
WHERE NOT EXISTS (
    select 1 
    from Destination t1 
    where (t2.Tel1!='' AND (t2.Tel1 IN (t1.Tel1,t1.Tel2,t1.Tel3))) 
      or 
      (t2.Tel2!='' AND (t2.Tel2 IN (t1.Tel1,t1.Tel2,t1.Tel3))) 
      or 
      (t2.Tel3!='' AND (t2.Tel3 IN (t1.Tel1,t1.Tel2,t1.Tel3))) 
    ) 
3

このクエリはこの情報をもう少し必要とします。あなたが効率的な方法でそれを書いたければ、それぞれの負荷が重複しているか新しいレコードが多いかを知る必要があります。 account_idが主キーであり、クラスタ化インデックスを持っていると仮定します。

IはPHONE_NOにインデックスの正規化されたテーブル#Rを作成された一時テーブルのアプローチを使用し

SELECT Phone, Account into #tmp 
FROM 
    (SELECT account_id, tel1, tel2, tel3 
    FROM destination) p 
UNPIVOT 
    (Phone FOR Account IN 
     (Tel1, tel2, tel3) 
)AS unpvt; 

ようACCOUNT_ID電話番号の最初の列と、このテーブルにクラスタ化されていない索引を作成してしまいます2番目の部分は口座番号です。完全なテーブルスキャンをエスケープすることはできませんので、インポートをスキャンすることができます(恐らくより小さい)。このテーブルと結合し、説明されているようにnot exists修飾子を使用してください。そして、もちろん、私はこのクエリのperforamanceにわからないが、私はそれを書くの努力をしているので、私はとにかくそれを掲載する予定処理後 ルーク

関連する問題