消除具有反向关系且无主键的元组

2024-04-23

我试图根据下面的问题插入所有关系。我已经得到了从 A 到 C 的所有关系(根据下面的问题)。但就我而言,我还得到了“C 与 A 的朋友”的记录。据我理解问题陈述“没有重复的友谊”,我必须将友谊插入为 A 到 C,而不是反之亦然。要么我对问题理解错误,要么得不到想要的结果。
因此,当我尝试将我得到的所有值插入表中时,我的结果是错误的。有些人的朋友数量超出了他们的期望,数量为 2。

表的结构如下:

Friend ( ID1, ID2 )

ID1 的学生与 ID2 的学生是朋友。友谊是相互的,因此如果 (123, 456) 在 Friend 表中,那么 (456, 123) 也在。

(无主键) 我试图解决的情况是:

“对于 A 与 B 是朋友、B 与 C 是朋友的所有情况,请为 A 和 C 对添加新的友谊。不要添加重复的友谊、已经存在的友谊或与自己的友谊。”

我已经尝试解决这个问题两天了。请帮忙。

提前致谢。

----我的SQL查询-----

select B.ID1 as ID1,B.ID3 as ID2
from (select A.ID1 as ID1,A.ID2 as ID2,A.ID3 as ID3,F3.ID2 as ID4
from (select F1.ID1 as ID1,F1.ID2 as ID2,F2.ID2 as ID3
from Friend F1 join Friend F2
on F1.ID2=F2.ID1
where F1.ID1<>F2.ID2) A join Friend F3
on A.ID3=F3.ID1) B
where B.ID1<>B.ID4
group by  B.ID1,B.ID3

我们假设(对于示例)朋友表包含这些行。

ID1 ID2
--- ---
 a   b
 a   c
 b   a
 b   c
 b   d
 c   b

首先,从识别朋友表中的“完整朋友”元组开始,使用如下查询:

SELECT fa.ID1
     , fa.ID2
  FROM friend fa
  JOIN friend fb
    ON fb.ID1 = fa.ID2
   AND fb.ID2 = fa.ID1

fa.ID1 fa.ID2
------ ------
  a      b
  b      a
  b      c
  c      b

这个结果告诉我们a是b的朋友,b是c的朋友。这(a,c) and (b,d)行被省略,因为没有逆,(c,a) or (d,b).

目前,我们将此集合称为“ft“(朋友元组)。现在我们可以针对该集合(ft)编写一个查询,以获取所有“a->b->c”和“c->b->a”朋友对。

SELECT fx.ID1
     , fy.ID2
  FROM ft fx
  JOIN ft fy
    ON fy.ID1 = fx.ID2 
   AND fy.ID2 <> fx.ID1

fx.ID1 fy.ID2
------ ------
  a      c
  c      a

但是,我们需要确保不会重复友元表中已有的任何行,因此我们可以使用 NOT IN 或 NOT EXISTS 谓词,或者我们可以使用反连接模式来消除匹配好友表中已有的一行。

SELECT fx.ID1
     , fy.ID2
  FROM ft fx
  JOIN ft fy
    ON fy.ID1 = fx.ID2 
   AND fy.ID2 <> fx.ID1
  -- eliminate rows that match
  LEFT
  JOIN friend fe
    ON fe.ID1 = fx.ID1
   AND fe.ID2 = fy.ID2
 WHERE fe.ID1 IS NULL

fx.ID1 fy.ID2
------ ------
  c      a

现在,我们可以将引用替换为ft使用生成该集合的查询(作为内联视图):

SELECT fx.ID1
     , fy.ID2
  FROM ( SELECT fa.ID1
              , fa.ID2
           FROM friend fa
           JOIN friend fb
             ON fb.ID1 = fa.ID2
            AND fb.ID2 = fa.ID1
       ) fx
  JOIN ( SELECT fc.ID1
              , fc.ID2
           FROM friend fc
           JOIN friend fd
             ON fd.ID1 = fc.ID2
            AND fd.ID2 = fc.ID1
       ) fy
    ON fy.ID1 = fx.ID2 
   AND fy.ID2 <> fx.ID1
  -- eliminate rows that match
  LEFT
  JOIN friend fe
    ON fe.ID1 = fx.ID1
   AND fe.ID2 = fy.ID2
 WHERE fe.ID1 IS NULL
 GROUP 
    BY fx.ID1
     , fy.ID2

(我想只要我们保证 (ID1,ID2) 是唯一的,这个查询就不会生成任何重复项。而且我认为这个查询只会生成指定的匹配项,而不是任何额外的匹配项.一些额外的测试用例是为了确认。如果查询确实产生任何重复项,则添加一个GROUP BY fx.ID1, fy.ID2查询会消除它们。)

最后,要将这些行放入朋友表中,请在查询之前添加:

INSERT INTO friend (ID1,ID2)

UPDATE

我们想要返回的结果实际上取决于如何表示“友谊”。

我假设“朋友”对出现在friend表通过两个元组的存在:两者(a,b)(b,a) 必须存在。 (当“a 朋友 b”和“b 朋友 a”时,就形成了友谊)。

如果只有一行存在,那不是真正的友谊,只是半途而废的友谊。

我运行了几个测试用例。通过它们进行工作有点乏味。我通过添加 ORDER BY 来扩展查询,以按确定的顺序返回行,并在 SELECT 列表中添加其他列,以验证“路径”(共享朋友)。我注释掉了 WHERE 子句,这样我就可以看到所有潜在的朋友。

我确实发现我需要添加一个GROUP BY以消除重复项。我们可以推导出a-c来自两个或多个共同朋友的友谊,例如b and r. Both a-b + b-c and a-r + r-c导致a-c.

这是我测试的最终查询。除了添加了 GROUP BY 之外,它本质上与前面的相同。

SELECT fx.ID1
     , fy.ID2
 --  , fx.ID1>fy.ID2 AS d
 --  , fx.ID1 AS x1
 --  , fx.ID2 As x2
 --  , fy.ID1 AS y1
 --  , fy.ID2 As y2
 --  , fe.ID1 AS e1
 --  , fe.ID2 AS e2
  FROM ( SELECT fa.ID1
              , fa.ID2
              , fa.ID1>fa.ID2 AS d
           FROM friend fa
           JOIN friend fb
             ON fb.ID1 = fa.ID2
            AND fb.ID2 = fa.ID1
       -- ORDER
       --    BY LEAST(fa.ID1,fa.ID2)
       --     , GREATEST(fa.ID1,fa.ID2)
       --     , fa.ID1>fa.ID2
       ) fx
  JOIN ( SELECT fc.ID1
              , fc.ID2
           FROM friend fc
           JOIN friend fd
             ON fd.ID1 = fc.ID2
            AND fd.ID2 = fc.ID1
       -- ORDER
       --    BY LEAST(fc.ID1,fc.ID2)
       --     , GREATEST(fc.ID1,fc.ID2)
       --     , fc.ID1>fc.ID2
       ) fy
    ON fy.ID1 = fx.ID2 
   AND fy.ID2 <> fx.ID1
  -- eliminate rows that match existing row
  LEFT
  JOIN friend fe
    ON fe.ID1 = fx.ID1
   AND fe.ID2 = fy.ID2
 WHERE fe.ID1 IS NULL
 GROUP
    BY fx.ID1
     , fy.ID2
 ORDER
    BY LEAST(fx.ID1,fy.ID2)
     , GREATEST(fx.ID1,fy.ID2)
     , fx.ID1>fy.ID2

如果仅存在一个元组“(a,b)”来表示完整的友谊,则意味着“(b,a)”,则需要更改查询。

内联视图查询fx and fy需要扩展以返回“丢失的”逆元组...如果 (a,b) 在朋友表中,我们的查询需要返回 (a,b) 和 (b,a)。我们可以通过在两个相同的查询之间执行 UNION ALL 操作来实现这一点,只是颠倒 SELECT 列表中列的顺序。 (在这里,我们实际上可以使用 UNION 而不是 UNION ALL 来消除任何重复项。)内联视图查询fx and fy会是这样的:

SELECT fa.ID1, fa.ID2 FROM ...
 UNION ALL
SELECT fa.ID2, fa.ID1 FROM ...

还需要更改好友表中消除匹配行的检查(如果我们发现现有的 (a,b) 或 (,我们希望从结果集中消除 (a,b) 和 (b,a) b,a) 行)

ON ( fe.ID1 = fx.ID1 AND fe.ID2 = fy.ID2 )
OR ( fe.ID1 = fy.ID2 AND fe.ID2 = fx.ID1 )

并且需要更改 SELECT 列表和 GROUP BY 以消除“额外的”逆元组。我们可以使用 ORDER BY 中的表达式

SELECT LEAST(fx.ID1,fy.ID2) AS ID1
     , GREATEST(fx.ID1,fy.ID2) AS ID2
       ...
 GROUP
    BY LEAST(fx.ID1,fy.ID2)
     , GREATEST(fx.ID1,fy.ID2)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

消除具有反向关系且无主键的元组 的相关文章

  • 我应该设计一个 SQL Server 数据库来依赖 UNION 还是避免它?

    执行以下 SQL 查询 SELECT Account Amount AS Deposit 0 00 AS Withdrawal Date FROM Deposits WHERE Account Account UNION SELECT Ac
  • 如何在JdbcTemplate中执行多批量删除?

    我想一次删除多个数据库条目 仅当 3 个字段匹配 此处 姓名 电子邮件 年龄 时 才应删除每个条目 如果我只想删除单个属性 我会选择 String sql DELETE FROM persons WHERE email IN JdbcTem
  • SQL 性能除外

    我尝试使用类似于以下查询的查询来查找两个表之间的差异 DEV 数据库与 TEST 数据库中的同一个表 每个表有约 30K 行和约 5 列 select field1 field2 field3 field4 field5 from dev
  • PHP 与 MySQL 中的资源 id #6 错误

    我这是为了我正在制作的投票系统 此代码向用户显示了他们可以从中选择的问题列表 div class main questions p class style1 style2 strong Select Your Question strong
  • H2 中的 IF 函数用于 MySQL 兼容性

    我正在使用 H2 具有 MySQL 兼容模式 针对我们使用 MySQL 的软件编写一些自动化测试 不幸的是 H2 似乎没有IF我们的许多查询都使用该函数 除了使用 DECODE 之类的东西重写我们的应用程序查询之外 它们是创建 if 函数
  • 带有输出文件和屏幕输出的 sqlcmd

    我使用 sqlcmd 执行一些命令行批处理 bat 如下所示 sqlcmd i Scripts STEP01 sql o PROCESS log S MYSERVER E d MYDATABASE 我需要一个输出文件 当前有效 以及通过屏幕
  • 将数据导入 MySQL Workbench

    我有一个包含 6 个表的数据库 我想将这些表导入到existingMySQL Workbench 中的数据库 我使用 phpMyAdmin 将数据库导出到 sql文件 并使用 数据导入 恢复 按钮将其导入到 MySQL Workbench
  • Windows 批处理文件中的 SQL 语句

    有没有办法让Windows批处理文件直接输入SQL语句而不需要调用脚本 我希望批处理文件登录SQL 然后直接输入语句 EDIT 我正在使用 Oracle v10g 对于单个命令 您可以使用以下技巧 echo select from dual
  • 在“读取初始通信数据包”时失去与 MySQL 服务器的连接,系统错误:61

    3天了 已经碰壁了 我正在运行 mac os x 我已经安装了mysql 5 5 14 osx10 6 x86 64 dmg 就上下文而言 我需要安装 mysql gem 以便与 ruby on Rails 一起使用 除非有一个有效的 my
  • SQL Server:是否可以同时插入两个表?

    我的数据库包含三个表 称为Object Table Data Table and Link Table 链接表仅包含两列 对象记录的标识和数据记录的标识 我想从中复制数据DATA TABLE它链接到一个给定的对象标识并将相应的记录插入到Da
  • 如何在存储过程中调用存储过程(带2个参数)?

    我有具有相同参数 服务器名称和日期 的存储过程 我想编写一个存储过程并在该 SP 中执行它们 称为 SP All CREATE PROCEDURE dbo SP All AS BEGIN exec sp 1 myDate datetime
  • 如何在MySQL中使用数字字符串的比较运算符?

    我有一个员工表 有类似领域的经验VARCHAR类型 此字段结合了用短划线 分隔的总年份和总月份 因此我必须按年份过滤具有 3 年以上经验的经验 我的表结构 所以现在我必须获得3年以上经验的id 我尝试如下 SELECT FROM emplo
  • 如何从其他表填充表的外键

    我有以下表格 其中translation是空的 我正在尝试填充 translation id translated language id template id language id langname langcode template
  • 在 LINQ 中选择案例[重复]

    这个问题在这里已经有答案了 我怎样才能把它翻译成 LINQ 呢 select t age as AgeRange count as Users from select case when age between 0 and 9 then 0
  • 如何调试 MySQL 上的锁等待超时?

    在我的生产错误日志中 我偶尔会看到 SQLSTATE HY000 一般错误 1205 超过锁等待超时 尝试 重新开始交易 我知道当时哪个查询正在尝试访问数据库 但是有没有办法找出哪个查询在那个精确时刻拥有锁定 暴露这一点的是这个词交易 从该
  • 似乎找不到循环 PL/SQL 数组的方法?

    我正在尝试这样做 arrCauses APEX UTIL STRING TO TABLE P1 CAUSE FOR c IN 1 arrCauses count LOOP INSERT INTO DT EVENT CAUSE EVENT I
  • 如何设置 MySQL Workbench 自动断开与服务器的连接?

    有没有办法设置Workbench在空闲时自动与服务器断开连接 命令行 mysql 客户端在空闲时断开连接 然后在运行查询时重新连接 我也希望 Workbench 自动断开连接 我无法修改服务器的超时设置 但命令行客户端可以按照当前服务器设置
  • 从 Inno Setup 项目内部调用 MySQL

    我正在为一些使用 MySQL 的软件编写安装程序 我正在尝试运行 sql用于在安装时设置数据库的脚本 唉 我目前在执行它时遇到了很大的问题 这个问题似乎是由于这样一个事实而产生的 当你设置一条通往 sql文件内的 execute SOURC
  • Azure 上的 Laravel 应用程序:用户“azure”@“localhost”的访问被拒绝

    我正在将 Laravel 应用程序部署到 Azure Web 应用程序 Mysql 到目前为止我执行了以下步骤 1 在应用程序中激活Mysql 2 连接到 BitBucket 存储库并确保代码已同步 3 创建 env文件并设置数据库变量如下
  • 在sql server中透视固定的多列表

    我有一个需要为报告服务进行旋转的表格 DateCreated Rands Units Average Price Success Unique Users 2013 08 26 0 0 0 0 0 2013 08 27 0 0 0 0 0

随机推荐

  • 如何删除 Native Base 中页眉的底线和页脚的顶线?

    如图所示 https i stack imgur com pjQOK png 我的应用程序在页脚顶部和页眉底部显示一条线 这在 Native Base 中似乎是很常见的事情 我已经检查了本机基础主题 但找不到一些来修复此错误 Code im
  • 具有混合成员类型的通用 TypeScript 接口

    对于几个 HTML 表单 我想配置输入并处理它们的值 我的类型具有以下结构 您可以将其复制到 TypeScript Playgroundhttp www typescriptlang org play http www typescript
  • 多类分类的每类 F1 分数

    我正在使用 python 和 scikit learn 解决多类分类问题 目前 我正在使用classification report函数来评估我的分类器的性能 获得如下报告 gt gt gt print classification rep
  • MongoDB atlas触发器出现错误:TypeError:无法访问未定义的成员“db”

    我是一个尝试 MongoDB atlas 免费套餐的新手 我有一个名为 mongoCluster 的集群 在它下面 我有一个数据库 testdb 在它下面有一个集合 testcollection 该集合包含文档 从我的 java 应用程序中
  • Windows 8 中的曲线文本块

    我想使用 XAML 创建 Curved TextBlock 如下所示 我正在这样做
  • Perl:安全评估?

    我很好奇是否有任何有关执行受限评估的好信息 查看文档 有一个use Safe有一个reval方法 但我不确定这有多安全 我想要做的是能够将各种条件语句作为字符串传递给函数 而无需滥用 eval 的源 例如 sub foo my stmt s
  • std::abs(0u) 格式错误吗?

    给出以下程序 include
  • 在 ubuntu 上使用 Kurento 安装错误

    我已经浏览了 Stackoverflow 上的所有 Kurento 问题 之前似乎没有出现过这个错误 我已经根据安装指南安装了 Kurento 媒体服务器和 java 客户端示例 我正在运行媒体服务器 当我去运行客户端应用程序时 问题就出现
  • Scapy 和 rdpcap 函数

    我在用着rdpcapScapy 的函数读取 PCAP 文件 我还使用中描述的模块Scapy 中 HTTP 支持的链接 http blog sbarbeau fr 2011 06 http support in scapy html在我的例子
  • 无法导入...(没有所需的模块提供包)

    我正在关注本教程 https www martin helmich de en blog kubernetes crd client html 我初始化我的项目并通过以下方式获取依赖项 go mod init github com mart
  • 如何在 AWS Step Functions 中的数组内使用 jsonPath

    我正在编写一个 AWS 步骤函数 对于其中一个步骤 我希望调用一个接受数组作为输入之一的 lambda 但是 如果我尝试将 JsonPath 传递到数组中 我会得到 The value for the field arrayField mu
  • 将 Session 变量传递给名为 PHP 脚本的 ajax

    在我的 PHP 脚本中使用会话时 我想将会话变量传递给 PHP 调用的脚本 但是会话变量没有被调用 因为在 HTML 代码之后无法使用 session start 函数 我正在使用简单的 Javascript AJAX 请给我路径 我认为您
  • NSCollectionView:仅接受项目之间的拖动,而不接受拖动

    我有一个NSCollectionView已实施且工作良好 然而 当 拖动项目来重新排列它们 我只想接受拖动 物体之间 当前的行为是您可以在对象之间拖动 它会打开一个 空间 而且over一个东西 我希望下面的图片能更好地说明问题 例如 将项目
  • Jquery DatePicker 颜色周日红

    有没有办法在 Jquery Datepicker 中将星期日的颜色更改为红色 something datepicker beforeShowDay function date if date toString indexOf Sun 1 r
  • 创建默认为纪元时间的字段

    我需要为表创建一个时间戳字段 该表的行需要在一定时间后过期 如果我使用以下内容 timestamp TIMESTAMP DEFAULT NOW 它以人类可读的格式显示时间 如果我可以用纪元时间来显示时间 这样我就可以用秒来计算 那就容易多了
  • GetWindowTextA、GetWindowText 在编辑控件上返回空值

    我正在尝试从 C Java 的外部窗口列出并获取编辑控件的内容 不幸的是没有成功 当我调用 GetWindowText 或 GetWindowTextA 时 它在编辑控件上返回空值 我知道 GetWindowText GetWindowTe
  • 如何动态覆盖 Angular2 可注入服务?

    我有一个可注入服务 HttpRequestService 当没有服务器时我想用 MockHttpRequestService 替换它 因为我正在开发模式下运行 npm start 这个 MockHttpRequestService 将发回非
  • 网页编码,设置矛盾[重复]

    这个问题在这里已经有答案了 如果一个网页有 但http标头有 Content Type text html charset UTF 8 那么假设什么编码呢 在 HTML5 中 优先级定义为 用户浏览器设置 字节顺序标记 HTTP 标头 or
  • 片段交易动画完成后执行操作

    我想在动画完成后设置按钮可见性 这就是所谓的动画 android support v4 app FragmentTransaction fAnimation this getActivity getSupportFragmentManage
  • 消除具有反向关系且无主键的元组

    我试图根据下面的问题插入所有关系 我已经得到了从 A 到 C 的所有关系 根据下面的问题 但就我而言 我还得到了 C 与 A 的朋友 的记录 据我理解问题陈述 没有重复的友谊 我必须将友谊插入为 A 到 C 而不是反之亦然 要么我对问题理解