1

我有一张表,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 毫秒的运行时间,但我想知道是否有更简单、更优雅的解决方案具有类似的运行时间。

4

1 回答 1

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);
于 2013-02-25T04:56:57.240 回答