寻找独特的元组和列排列

时间:2013-02-25 04:48:03

标签: mysql sql permutation

我有一张numbers的表格,其中包含范围nums

中的各种[0-9]
 --------
 | nums |
 --------
 |  0   |
 |  1   |
 | .... |
 |  9   |
 --------

我想多次使用此表的笛卡尔积(事实上,准确地说是8次):

SELECT * FROM numbers A, numbers B, numbers C, numbers D, ...

这样A.numsB.nums, ...是唯一的组合,并且它们不等于另一个数字的相同值。

以下是我想看到的一些示例输出:

(0, 1, 2, 3)
(3, 2, 1, 0)
(2, 1, 3, 0)
(0, 2, 1, 3)
(0, 9, 8, 7)
(1, 2, 3, 4)
(1, 3, 5, 9)
(1, 9, 8, 7) 

...但是没有像(0, 0, 1, 2), (1, 1, 2, 2), etc.元组这样的元素也不应该重复,例如(1, 2, 3, 4) and (1, 2, 3, 4) 元组中的每个值必须与元组中的另一个值不同

我确信有更有效的方法可以做到这一点,但我已经采用了A.nums != B.nums, ...来实现每一种可能性。它似乎相对有效;为8路笛卡尔积提供约300毫秒的运行时间,但我想知道是否有一个更简单,更优雅的解决方案,具有相似的运行时间。

1 个答案:

答案 0 :(得分:2)

CREATE TABLE nums (x INT);

INSERT INTO nums (x) VALUES (0), (1), (2), (3), (4); 

SELECT a.x, b.x, c.x, d.x 
FROM nums AS a 
JOIN nums AS b ON b.x NOT IN (a.x) 
JOIN nums AS c ON c.x NOT IN (a.x, b.x) 
JOIN nums AS d ON d.x NOT IN (a.x, b.x, c.x);