2011-08-16 195 views
14

以下是一個假設情況,它與我真正的問題很接近。表1刪除SQL中的重複項加入

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

我有一個表2,看起來像這樣

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

現在,如果我加入了桌子上recid,它會給0的結果,不會有重複的,因爲recid是獨一無二的。但是,如果我加入名字和姓氏列,這些列不是唯一的並且存在重複項,則我會在內部聯接上獲得重複項。我加入的列越多,它變得越差(創建更多副本)。

在上面的簡單情況下,如何刪除以下查詢中的重複項。我想比較名字和姓氏,如果他們匹配,我返回名字,姓氏和recid從表2

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

腳本就在這裏,如果有人想在未來

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

發揮它你不想自己做一個連接,你只是測試存在/集合包含。

我不知道你編碼的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,內部聯接可能被不同地實現以一個EXISTS (semi-join vs join),但無論如何,優化器有時可以將其解決,並選擇正確的運算符,而不管您使用哪種方式編寫它。

+0

他的示例代碼在兩個數據集中都有一個select *,但他的描述聲明「我想比較名和姓,如果它們匹配,我從table2 *返回firstname,lastname和recid *」 –

+0

這就是它。我想我不需要連接,但是如果有可能的話,有人可以在連接中解釋它。 –

+0

他使用'INNER JOIN'ed結果集中的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 

編輯:添加圖片

enter image description here

+0

我嘗試類似於我原來的查詢,但由於某種原因沒有工作,謝謝。 –

+0

@Savage花園:你的意思是我提供的不正常的查詢?圖像是否代表錯誤的結果集? – sll

+0

它確實有效。問題是我只想保持獨特的recid。其餘的可以重複。就像我不想通過t2.first和t2.last來分組。但是使用group by,你必須使用它。 –