Удаление дубликатов из SQL Join
Ниже приведены гипотетические ситуации, близкие к моей реальной проблеме. Table1
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 уникален. Но если я присоединяюсь к первому и последнему столбцам, которые не являются уникальными, а есть дубликаты, я получаю дубликаты во внутреннем соединении. Чем больше столбцов я добавляю в join, тем хуже становится (создается больше дубликатов).
В приведенной выше простой ситуации, как удалить дубликаты в следующем запросе. Я хочу сравнить 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
Script здесь, если кто-то хочет играть с ним в будущем
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
Вы не хотите делать соединение как таковое, вы просто проверяете наличие/включение включения.
Я не знаю, какой текущий вкус 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
В зависимости от СУБД внутреннее соединение может быть реализовано по-разному с Exists (semi-join vs join), но оптимизатор иногда может понять это и выбрать правильный оператор независимо от того, каким образом вы его записываете.
Ответ 2
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]()