【问题标题】:Select unique pairs in self join在自联接中选择唯一对
【发布时间】:2011-11-19 11:04:57
【问题描述】:

我正在尝试使用自联接在 sqlite 中编写一个简单的查询。我想要具有相同成本的产品的所有 ID 对,但我想要唯一的对(即即使以不同的顺序也不要将同一对列出两次)。 这是我得到的:

SELECT b1.Id, b2.Id
FROM Basic AS b1
LEFT JOIN Basic AS b2
ON b1.cost = b2.cost
WHERE b1.Id != b2.Id
AND b1.Cost = 5;

所以我得到了类似的东西

23 | 101
23 | 205
24 | 103
101 | 23 <-- Duplicate!

我尝试了 DISTINCT 和 GROUP BY 的不同组合,但仍然得到重复的对:

我尝试过类似的东西

选择不同的 bp1.Id、bp2.Id ...

& ... = 5 按 bp1.Id、bp2.Id 分组;

我怎样才能摆脱重复的对?有什么想法吗?

感谢您的帮助!

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    将 WHERE 子句中的 != 更改为 &lt; 以确保始终先出现最低 ID:

    WHERE b1.Id < b2.Id
    

    【讨论】:

    • 如果有超过 1 组符合条件的 id,则此方法不起作用。
    【解决方案2】:

    如果您有超过 1 组不同长度的 ID,例如,简单比较 ID WHERE b1.Id &lt; b2.Id 将不起作用。要在同一个工作空间中获取所有 ID,您可以在 where 子句中获取 MD5 哈希:

    WHERE MD5(b1.Id) < MD5(b2.Id)
    

    在 sqlite 中,MD5 哈希函数可能不是内置的,但您可以使用任何可能内置的哈希函数或创建您的用户定义的哈希函数来代替它。

    【讨论】:

      猜你喜欢
      • 2011-11-22
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多