SQL中交叉连接的组合(不是排列)

25
如果我想要对一张表进行自身的交叉连接,如何去除重复行呢?换言之,如何做到“顺序不影响结果”的交叉连接呢?
比如,如果我有一张名为 T 的表:
field |
-------
   A  |
   B  |
   C  |

我会对自身进行交叉连接,以避免出现A | A的行。

T as t1
cross join
T as t2
  on t1.field != t2.field

我将得到以下内容:
field | field
------+-------
  A   |   B
  A   |   C
  B   |   A
  B   |   C
  C   |   A
  C   |   B

然而,对我来说,A和B是一样的,就像B和A一样。

有没有好的方法可以去除这些重复项?换句话说,我想要的是组合而不是排列。

1个回答

38
T as t1
inner join
T as t2
  on t1.field < t2.field

值得一提的是,你可以使用INNER JOIN来实现这个功能,它并不是严格意义上的CROSS JOIN。MySQL(或其他某些关系型数据库管理系统)将这两种类型的JOIN视为相同的,但在ANSI SQL中,CROSS JOIN没有JOIN条件——它是一个故意的笛卡尔积。


很抱歉几个月后才回复,但我只是确认一下:这会从一个列表(A、B、C)中创建组合,而不是排列:((A,B),(A,C),(B,C)),对吗?另外,如果我想根据某列的值从列表的子集中创建组合,我只需添加WHERE子句,对吗?谢谢。 - Brash Equilibrium
1
@BrashEquilibrium,在组合中,顺序不重要;(A,B)与(B,A)是同一子集。这个解决方案确保只选择其中的一个。虽然这意味着t1.field始终会在t2.field之前排序,但这并不意味着它是一个排列。是的,您可以使用WHERE子句进一步限制匹配。 - Bill Karwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接