在自联接中选择唯一对

时间:2011-09-17 21:57:24

标签: sql sqlite

我正在尝试使用自联接在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的不同组合,但我仍然得到重复对:

我尝过像

这样的东西

SELECT DISTINCT bp1.Id,bp2.Id ...

&安培; ... = 5 GROUP BY bp1.Id,bp2.Id;

如何摆脱重复对?有什么想法吗?

我将非常感谢您的帮助!

2 个答案:

答案 0 :(得分:39)

在WHERE子句中将!=更改为<,以确保始终列出最低ID:

WHERE b1.Id < b2.Id

答案 1 :(得分:0)

例如,如果您有超过 1 组不同长度的 ID,那么简单地比较 ID WHERE b1.Id < b2.Id 是行不通的。要获取同一工作空间中的所有 ID,您可以在 where 子句中使用 MD5 哈希:

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

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