2011-08-16 36 views
14

以下は、私の本当の問題に近い仮説的状況です。 RECIDが一意であるため、表1SQL結合からの重複の削除

recid firstname lastname company 
1  A    B   AAA 
2  D    E   DEF 
3  G    H   IJK 
4  A    B   ABC 

私はRECID上のテーブルを結合する場合は今、それが0の結果が得られます。この

recid firstname lastname company 
10  A    B   ABC 
20  D    E   DEF 
30  M    D   DIM 
40  A    B   CCC 

のように見えるテーブル2を持っているが、何の重複はありません。しかし、私が一意ではなく、重複しているfirstnameとlastnameの列に参加すると、内部結合に重複があります。結合に追加する列が多いほど、悪化します(重複が多く作成されます)。

上記の単純な状況では、次のクエリで重複を削除するにはどうすればよいですか。私は、誰もが将来

create table table1 (recid int not null primary key, first varchar(20), last varchar(20), company varchar(20)) 
create table table2 (recid int not null primary key, first varchar(20), last varchar(20), company varchar(20)) 

insert into table1 values(1,'A','B','ABC') 
insert into table1 values(2,'D','E','DEF') 
insert into table1 values(3,'M','N','MNO') 
insert into table1 values(4,'A','B','ABC') 

insert into table2 values(10,'A','B','ABC') 
insert into table2 values(20,'D','E','DEF') 
insert into table2 values(30,'Q','R','QRS') 
insert into table2 values(40,'A','B','ABC') 
+1

あなたが戻ってRECIDを必要としない - いない場合は、クエリからそれを削除すると、あなたの問題を解決します。 – Paddy

+0

はい、そうでなければ私は残りをしました。 –

+1

非重複行のロジックを決定する必要があります。 CompanyIdとRecIdはあなたの詐欺師とは異なります。これらのうちどれを保存したいですか? – JNK

答えて

14

でそれをプレイしたい場合、スクリプトはここにある

select distinct * from 
(select recid, first, last from table1) a 
inner join 
(select recid, first,last from table2) b 
on a.first = b.first 

それらが一致した場合、私はtable2の

からファーストネーム、姓とRECIDを返し、姓と名を比較したいです参加自体は望んでおらず、単に存在/集合の包含をテストしているだけです。

私はあなたがコーディングしているSQLの現在の風味がわかりませんが、これはうまくいくはずです。

SELECT MAX(recid), firstname, lastname 
FROM table2 T2 
WHERE EXISTS (SELECT * FROM table1 WHERE firstname = T2.firstame AND lastname = T2.lastname) 
GROUP BY lastname, firstname 

あなたが参加として実装する場合は、ほぼ同じコードを残す:

SELECT max(t2.recid), t2.firstame, t2.lastname 
FROM Table2 T2 
INNER JOIN Table1 T1 
    ON T2.firstname = t1.firstname and t2.lastname = t1.lastname 
GROUP BY t2.firstname, t2.lastname 

すなわち内部結合存在に異なる方法で実装することができるDBMSに応じて、 (semi-join vs join)オプティマイザは、とにかくそれを把握し、あなたがそれを書く方法にかかわらず、正しい演算子を選択することがあります。

+0

彼のサンプルコードは両方のデータセットからselect *を持っていましたが、彼の記述は "私がfirstnameとlastnameを比較したいと、私はfirstname、lastnameとrecid *をtable2 *から返します" –

+0

これです。私は参加する必要はないと思うが、可能であれば誰かが参加して説明することもできる。 –

+0

彼のサンプルコードは、 'INNER JOIN'の結果セットから' SELECT DISTINCT * 'を使って、両方のテーブルのデータが必要であることをはっきりと示しています。私が間違っていて、彼が明らかにしたら、私は幸せにDVを取り除くでしょう。 – JNK

4
SELECT t2.recid, t2.first, t2.last 
FROM table1 t1 
INNER JOIN table2 t2 ON t1.first = t2.first AND t1.last = t2.last 
GROUP BY t2.recid, t2.first, t2.last 

EDIT:追加されました絵

enter image description here

+0

元のクエリと似たようなことを試みましたが、何らかの理由でうまくいきませんでした。 –

+0

@ Savage Garden:私が提供したクエリは意味がありませんか?イメージは間違った結果セットを表していますか? – sll

+0

それは動作します。問題は、私はrecidを一意に保つことだけです。残りは重複することができます。私はt2.firstとt2.lastでグループ化したくないのです。しかし、by by groupを使用すると、それを使用する必要があります。 –

関連する問題