gpt4 book ai didi

sql - 从 SQL Join 中删除重复项

转载 作者:行者123 更新时间:2023-12-03 13:29:03 25 4
gpt4 key购买 nike

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

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

我有一个看起来像这样的 table2
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 列上加入,它们不是唯一的并且有重复,我会在内部连接上得到重复。我在 join 上添加的列越多,情况就越糟(创建的重复项越多)。

在上述简单情况下,如何删除以下查询中的重复项。我想比较名字和姓氏,如果它们匹配,我从表 2 中返回名字、姓氏和 recid
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')

最佳答案

您不想进行连接本身,您只是在测试存在/集合包含。

我不知道您正在编码的 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

如果要实现为连接,则代码大致相同:

IE。
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(半联接与联接)不同,但优化器有时无论如何都能弄清楚并选择正确的运算符,无论您以哪种方式编写它。

关于sql - 从 SQL Join 中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7084577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com