2011-08-16 32 views
14

La siguiente es una situación hipotética que está cerca de mi problema real. Tabla 1Eliminar duplicados de SQL Unirse

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

Tengo una tabla2 que se parece a este

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

Ahora bien, si me uno a la tabla de la recid, que dará a 0 resultado, no habrá duplicados debido a recid es único. Pero si me uno a las columnas firstname y lastname, que no son únicas y hay duplicados, obtengo duplicados en la combinación interna. Cuantas más columnas agregue en join, peor se vuelve (se crean más duplicados).

En la situación simple anterior, ¿cómo puedo eliminar duplicados en la siguiente consulta. Quiero comparar nombre y apellido, si coinciden, vuelvo nombre, apellido y recid de tabla2

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

guión es aquí si alguien quiere jugar con él en el futuro

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

¿Necesita la recid vuelta - si no, suprimirla de la consulta podría solucionar el problema. – Paddy

+0

sí, de lo contrario, he hecho el resto. –

+1

Tienes que decidir sobre la lógica para tus filas que no son dupe. CompanyId y RecId son diferentes para sus engaños. ¿Cuál de estos quieres conservar> – JNK

Respuesta

14

No desea hacer una unión per se, simplemente está probando la existencia/establecer la inclusión.

No sé qué sabor actual de SQL está codificando, pero debería funcionar.

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 

Si desea implementar como una combinación, dejando el código en gran medida el mismo:

es decir

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 

Dependiendo del DBMS, una combinación interna puede ser implementado de manera diferente a un Exists (semi-join vs join) pero el optimizador a veces puede resolverlo de todos modos y elegir el operador correcto independientemente de la forma en que lo escriba.

+0

Su código de muestra tenía un * seleccionado de ambos conjuntos de datos, pero su descripción decía "Quiero comparar nombre y apellido, si coinciden, devuelvo firstname, lastname y recid * from table2 *" –

+0

esto es todo. Supongo que no necesito unirme, pero ¿alguien puede explicarlo también si es posible? –

+0

Su código de muestra que usa 'SELECT DISTINCT *' de un conjunto de resultados 'INNER JOIN' indica claramente que desea datos de ambas tablas. Si me equivoco y él aclara, felizmente eliminaré el 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: Añadido foto

enter image description here

+0

Intenté de manera similar a mi consulta original, pero no funcionó por alguna razón, gracias. –

+0

@Savage Garden: ¿quieres decir que la consulta que he proporcionado no funciona? ¿La imagen representa un conjunto de resultados incorrecto? – sll

+0

Funciona. El problema es que solo quiero mantener el recid único. El resto puede ser duplicado. Como si no quisiera agrupar por t2.first y t2.last. Pero usando group by, debes usarlo. –