回答

收藏

从SQL在连接中删除镜像对

技术问答 技术问答 233 人阅读 | 0 人回复 | 2023-09-14

我有一个包含两个字段(名称、兴趣)的表,我想找出所有兴趣相同的对方,删除所有重复项目和镜像对。0 V5 X! ]( E0 ]% K. R1 z% l
我可以找到所有正确的,并使用以下内容SQL删除语句重复项:% B/ W$ G% [- O$ l( _$ @
SELECT P1.name AS name1,P2.name AS name2,P1.interest FROM Table AS P1,Table AS P2WHERE P1.interest = P2.interest AND P1.name  P2.name;但我不确定如何删除镜像对,即:
# M6 @' |" x# S3 Y"wil","ben","databases"! r& b* H% u$ _3 C3 N* F$ X
"ben","wil","databases"- I' s$ ?% h! _0 X6 A/ G5 B
我试图把上面的句子变成一个名字Matches并尝试了以下查询:
# l3 ~) w2 ?6 P- V; CSELECT * FROM MatchesWHERE name2  (select name1 from Matches);但它不会删除所有的镜像对。
- n6 t, N3 H* r( r, k& i                                                                1 s% P  B3 \7 w4 J9 M- L5 p4 l5 R
    解决方案:                                                                ( m$ V, I0 _, V$ q
                                                                假设你不在乎哪一个最终会粘在一起(ben,will)与(will,ben)之间,我的首选解决方案是执行以下操作:8 ]' U. O% i$ |* D9 M" _
DELETE p2 FROM Pairs p1 INNER JOIN Pairs p2     on p1.Name1 = p2.Name2     and p1.Name2 = p2.Name1     and p1.Interest = p2.Interest    -- match only one of the two pairs    and p1.Name1 > p1.Name2因为你永远不会拥有它Name1和Name2相等的事实,所以当第一个成员小于第二个成员时,必须始终存在一对。使用这种关系,我们可以删除重复项。
0 F4 V3 O# A2 X" [- Z# Y如果你有一个相关的代理键,那就特别容易了,因为名称1和名称2的要求消失了。( V% U; Y, e# K# `3 @% [  {" N7 S
编辑:    如果您不想从表中删除它们,而只是从特定的查询结果中删除它们,请使用它们SELECT而不是使用相同的模式DELETE。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则