从SQL Join中删除重复项

时间:2011-08-16 20:28:48

标签: sql join

以下是一个假设的情况,这接近我的实际问题。表1

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

我有一个看起来像这样的桌子

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

现在如果我在recid上加入表,它将得到0结果,因为recid是唯一的,所以不会有重复。但是如果我加入firstname和lastname列,它们不是唯一的并且有重复项,那么我会在内部联接上获得重复项。我在连接时添加的列越多,它就越糟糕(创建更多的重复项)。

在上述简单的情况下,如何删除以下查询中的重复项。我想比较firstname和lastname,如果它们匹配,我返回firstname,lastname和recid from table2

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')

3 个答案:

答案 0 :(得分:19)

您不希望自己进行连接,而只是测试存在/设置包含。

我不知道您编写的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(半联接vs联接)不同地实现,但优化程序有时可以解决它并选择正确的运算符,无论您以何种方式编写它。

答案 1 :(得分: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

答案 2 :(得分:0)

在某些情况下,您必须在子查询中进行分组

选择不同的b.recid,b.first,b.last 来自表1 a 内部联接 ( 选择max(recid)作为recid,第一个,最后一个 来自表2 按首尾分组 )b 在a.first = b.first和a.last = b.last