我自己加入了一个表,并且我在下图中突出显示了重复的对,如何删除它们?
select DISTINCT A.name as name1 , B.name as name2 from (select name , ratings.* from reviewers inner join ratings on reviewers.id = ratings.reviewer_id ) A , (select name , ratings.* from reviewers inner join ratings on reviewers.id = ratings.reviewer_id ) B where A.reviewer_id <> B.reviewer_id and A.book_id = B.book_id order by name1 , name2 ASC
名称1 | 名称2 |
---|---|
爱丽丝刘易斯 | 伊丽莎白·布莱克 |
克里斯·托马斯 | 约翰·史密斯 |
克里斯·托马斯 | 迈克·怀特 |
伊丽莎白·布莱克 | 爱丽丝刘易斯 |
伊丽莎白·布莱克 | 杰克·格林 |
杰克·格林 | 伊丽莎白·布莱克 |
乔·马丁内斯 | 迈克·安德森 |
约翰·史密斯 | 克里斯·托马斯 |
迈克·安德森 | 乔·马丁内斯 |
迈克·怀特 | 克里斯·托马斯 |
上表曾经是一张图片
你可以这样做
请参阅此示例
我已经创建了 DDL 和 DML 语句来重现数据库并编写检索不重复对的查询。这是可能对其他人有帮助的“构建”代码:
这是重构的查询:
同一个子查询使用别名 A 和 B 两次,组合
reviewers
和ratings
表并检索每对评论者-书籍评级的数据。 p>然后,主外部查询从子查询结果中选择不同的审阅者姓名对。我们在 3 个条件下在子查询 A 和 B 之间使用
JOIN
:A.book_id = B.book_id
因此这对评论者对同一本书进行了评分。A.id B.id
用于过滤掉具有相同 ID 的评论者对,防止自我匹配。A.name 确保这些对的排序与下面的输出一致,从而消除重复。这样,对于给定的一对,仅考虑一种名称组合,例如“Elizabeth Black-Jack Green”,但不考虑“Jack Green-Elizabeth Black”。
这是您将从重构的查询中获得的输出: