当前位置: 首页 > 面试题库 >

从SQL连接中删除镜像对

那绪
2023-03-14
问题内容

我有一个包含2个字段(名称,兴趣)的表,我想查找所有具有相同兴趣的对,并删除所有重复项和镜像对。

我可以找到所有对,并使用以下SQL语句删除重复项:

SELECT P1.name AS name1, P2.name AS name2, P1.interest 
FROM Table AS P1, Table AS P2
WHERE P1.interest = P2.interest AND P1.name <> P2.name;

但是我不确定如何删除镜像对,即:

"wil","ben","databases"

"ben","wil","databases"

我试图使上面的语句成为一个称为Matches的视图,并尝试了以下查询:

SELECT * FROM Matches
WHERE name2 <> (select name1 from Matches);

但是它不会删除所有镜像对。


问题答案:

假设您不在乎哪个对最终会粘在(ben,will)与(will,ben)之间,那么我的首选解决方案是执行以下操作:

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相等的事实,因此在第一个成员小于第二个成员的情况下,必须始终存在一对。使用该关系,我们可以删除重复项。

如果您具有关系的代理键,那么这特别容易,因为这样名称1和名称2不相等的要求就消失了。

编辑: 如果您不想从表中删除它们,而只是从特定查询的结果中删除它们,请使用SELECT而不是使用相同的模式DELETE



 类似资料:
  • 删除本地镜像 如果要删除本地的镜像,可以使用 docker image rm 命令,其格式为: $ docker image rm [选项] <镜像1> [<镜像2> ...] 用 ID、镜像名、摘要删除镜像 其中,<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要。 比如我们有这么一些镜像: $ docker image lsREPOSITORY

  • 我想从两个表中删除相关的行。可能有外键,也可能没有。因此,可以肯定的是,我不想依赖外键及其在DELETE上的

  • 我有两个火花DF,我需要加入。只选择df1中存在的df2中的值,不应该有重复的行。 例如: df1: df2: 我正在做以下工作: 但是我的输出有几个重复的行。 如果val从df1中删除,我试图实现一个类似except的操作。但是除了之外,

  • 在配置DBCP2池时,根据文档,我注意到-有一个名为timebetweenvictionrunsmillis的配置,描述如下: 空闲对象逐出器线程运行之间的Hibernate毫秒数。如果为非正,则不会运行空闲对象逐出器线程。 其默认值为-1。 这是否意味着逐出器线程永远不会在默认配置下运行?那么配置参数maxIdle是如何强制的?如果空闲连接的计数大于maxIdle,池必须退出空闲连接。 默认配置

  • 我试图通过2列连接2个pyspark数据帧,数据帧是: DF1: df2: 我想得到下面的数据帧: 我试过了: 这会让我: 然后我使用以下方法消除重复项: 有没有更好的方法? 我尝试了其他连接(左连接、内连接等。),但不会得到我想要的结果 还有,有没有更好的方法来消除重复行?

  • 问题内容: 我有一个CTE,它是表上的一条select语句。现在,如果我从CTE中删除了1行,它会从我的基本表中删除该行吗? 如果我有一个临时表而不是CTE,是否也是如此? 问题答案: 检查DELETE语句文档, 可以 ,您可以使用CTE进行删除,这会影响基础表。同样对于UPDATE语句… 如果我有一个临时表而不是CTE,是否也是如此? 不,从临时表中删除只会影响临时表-与数据所来自的表没有任何关