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 に答える