我有一张numbers
的表格,其中包含范围nums
[0-9]
--------
| nums |
--------
| 0 |
| 1 |
| .... |
| 9 |
--------
我想多次使用此表的笛卡尔积(事实上,准确地说是8次):
SELECT * FROM numbers A, numbers B, numbers C, numbers D, ...
这样A.nums
和B.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毫秒的运行时间,但我想知道是否有一个更简单,更优雅的解决方案,具有相似的运行时间。
答案 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);