首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >帮助删除关系代数中的重复反向对

帮助删除关系代数中的重复反向对
EN

Database Administration用户
提问于 2015-10-25 20:17:28
回答 1查看 7.1K关注 0票数 1

我有一个包含重复反转对的数据列表,我需要删除它们。打电话给他们,name1和name2。在我有汤姆和迈克,迈克和汤姆的地方,这对单打被计算了两次。

代码语言:javascript
复制
 name1 | name2
-------|-------
 Tom   | Mike
 Pete  | Jenny
 Bill  | Jenny
 Joe   | Mary
 Mike  | Tom
 Jenny | Pete
 Jenny | Bill
 Mary  | Joe
 Linda | Jenny

该列表是学生与辅导员初次匹配的结果,然后是学生/辅导员和辅导员表的产物,这导致了一个更长的列表,并且能够减少到上面的两对。但是,现在无法摆脱这些复制品了。

虽然我在梳理成对的桌子时可能犯了个错误,但我暂时还是被那张桌子困住了。这是一份学生与辅导员配对的名单。

有没有办法解除名单,还是我需要重新开始?

EN

回答 1

Database Administration用户

发布于 2015-10-26 07:32:11

你需要返回一个现有的组合吗,例如,如果只有Tom,Mike,您需要准确地返回这个,还是Mike,Tom也可以吗?

代码语言:javascript
复制
-- order of columns doesn't matter
SELECT DISTINCT
   CASE WHEN name1 > name2 THEN name2 ELSE name1 END as name1,
   CASE WHEN name1 < name2 THEN name2 ELSE name1 END as name2
FROM tab;

-- order of columns is maintained
SELECT DISTINCT name1,name2 -- DISTINCT might not be needed
FROM tab AS t1
WHERE NOT EXISTS(
  SELECT * FROM tab AS t2
  WHERE t1.name1 = t2.name2
    AND t1.name2 = t2.name1
    AND t1.name1 > t2.name1)
;

请参阅小提琴

如果您想要删除这些行,您可以使用第二个逻辑,实际的语法取决于您的DBMS:

代码语言:javascript
复制
DELETE --change to SELECT * to see which rows will be deleted
FROM tab AS t1
WHERE EXISTS(
  SELECT * FROM tab AS t2
  WHERE t1.name1 = t2.name2
    AND t1.name2 = t2.name1
    AND t1.name1 > t2.name1)
;
票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/119139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档