【问题标题】:How to remove reversed duplicates from my query result?如何从我的查询结果中删除反向重复?
【发布时间】:2020-02-16 10:18:06
【问题描述】:

我解决了 Lagunita Stanford 的 SQL 练习,我在第 3 题(SQL 社交网络查询练习)处停下来。我不知道如何从我的查询结果中删除反向重复:

    Gabriel    9  |  Cassandra  9
    ------------------------------
    Cassandra  9  |  Gabriel    9
    ------------------------------
    Jessica    11 |  Kyle       12
    ------------------------------
    Kyle       12 |  Jessica    11

答案应该是:

        Cassandra  9  |  Gabriel    9
        ------------------------------
        Jessica    11 |  Kyle       12

这是我的代码:

SELECT h1.name,
   h1.grade,
   h2.name,
   h2.grade          
FROM likes AS likes1
INNER JOIN likes AS likes2
   ON likes1.id1 = likes2.id
   AND likes1.id2 = likes2.id1
INNER JOIN highschooler  AS h1 ON likes1.id1 = h1.id
INNER JOIN highschooler  AS h2 ON likes2.id1 = h2.id

表: https://lagunita.stanford.edu/c4x/DB/SQL/asset/socialdata.html

而且我不能使用窗口函数和 cte 的。

我很好奇这是否可以删除同一查询中的重复项。

【问题讨论】:

  • 简化问题。不要在此查询中加入 highschooler 表。只专注于删除 likes 表中的重复项,然后将结果作为子查询加入 highschooler。虽然不允许窗口函数和 CTE,但我假设允许子查询?
  • 他们是。您对简化是正确的,但这并没有改变我问题的核心。我仍然需要删除反向重复项。

标签: sql sqlite duplicates


【解决方案1】:

您当前形成的结果集包含每对两次,删除两行之一所需要做的就是应用WHERE 子句:

SELECT h1.name name1,
       h1.grade grade1,
       h2.name name2,
       h2.grade grade2
FROM likes AS likes1
INNER JOIN likes AS likes2 ON likes1.id1 = likes2.id2 AND likes1.id2 = likes2.id1
INNER JOIN highschooler  AS h1 ON likes1.id1 = h1.id
INNER JOIN highschooler  AS h2 ON likes2.id1 = h2.id
WHERE h1.name < h2.name 

也可以是:

WHERE likes1.id1 < likes1.id2  

如果有两个高中生同名的情况。
请参阅demo
结果:

| name1     | grade1 | name2   | grade2 |
| --------- | ------ | ------- | ------ |
| Cassandra | 9      | Gabriel | 9      |
| Jessica   | 11     | Kyle    | 12     |

【讨论】:

  • 最好完全消除名称比较,不仅因为它会消除重复名称的潜在问题,而且重复出现在 likes 表上,并且比较整数值更有效而不是比较字符串。
  • 比较整数值比比较字符串更有效确实如此。我将名称比较保留为第一个建议,只是因为这是预期结果表明 OP 想要的。我更喜欢比较 id,后来我想我宁愿在 ON 子句中设置它。
  • @beginsql 你意识到这只会返回重复的对,而不仅仅是从查询中删除它们。如果您有任何一侧的likes,则此查询将不会返回这些。如果这是您想要的,那就太好了,但是标题问题或示例数据或解释在这方面有任何澄清。
  • 你意识到这只会返回重复的对这就是 OP 的代码所做的,从这个条件很明显:ON likes1.id1 = likes2.id2 AND likes1.id2 = likes2.id1
  • 这就是为什么我将答案更改为直接引用 OP。我意识到您只是在构建答案,但尤其是对于初学者,我经常看到问题和示例数据并不总是充分涵盖实际情况。他们经常会错过这样的关键细节。他要求通过简单的 WHERE 条件解决的解决方案这一事实让我怀疑......
猜你喜欢
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 2016-03-16
相关资源
最近更新 更多