テーブルに行を挿入するのではなく、組み合わせ結果を取得したいだけです。1つのテーブル内の異なる列の値の組み合わせを取得する方法は?
たとえば、列はA、B、Cです。
Value set for A is {1,2}
Value set for B is {a,b}
Value set for C is {!,@}
The combination I want are:
1 a !
1 a @
1 b !
1 b @
2 a !
2 a @
2 b !
2 b @
テーブルに行を挿入するのではなく、組み合わせ結果を取得したいだけです。1つのテーブル内の異なる列の値の組み合わせを取得する方法は?
たとえば、列はA、B、Cです。
Value set for A is {1,2}
Value set for B is {a,b}
Value set for C is {!,@}
The combination I want are:
1 a !
1 a @
1 b !
1 b @
2 a !
2 a @
2 b !
2 b @
を使用することができますfiddle
です:
SELECT
T.A,
T2.B,
T3.C
FROM
test T
CROSS JOIN test T2
CROSS JOIN test T3
ORDER BY
T.a,
T2.b,
T3.c;
これは、CROSS JOIN演算を使用します。これは、2つのテーブルのデカルト積を生成します。つまり、他のすべての行と一致するすべての行が生成されます。これは、あまり使われていないSQLの部分です。ここの良い説明があります:
http://sqlfiddle.com/#!4/91137/3
: http://www.w3resource.com/oracle/joins/oracle-cross-join.phpはここに私のコードの実施例を参照してください。
我々が持っているテーブル:だから
CREATE TABLE test
( a NUMBER,
b VARCHAR2(20 CHAR),
c VARCHAR2(20 CHAR)
)
に、あなたが必要とする照会:
SELECT t.a, t2.b, t3.c FROM test t
CROSS JOIN test t2
CROSS JOIN test t3
ORDER BY t.a, t2.b, t3.c;
あなたはクロスが同じテーブルに結合を使用することができます。
CREATE TABLE test (A varchar(10), B varchar(10),C varchar(10));
INSERT INTO test (A, B, C) VALUES ('1', 'a', '!');
INSERT INTO test (A, B, C) VALUES ('2', 'b', '@');
、あなたが行うことができます:スキーマが
CREATE TABLE IF NOT EXISTS `docs` (
`id` int(6) unsigned NOT NULL,
`A` int(3) unsigned NOT NULL,
`B` varchar(10) NOT NULL,
`C` varchar(10) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `docs` (`id`, `A`, `B`, `C`) VALUES
('1', '1', 'a', '!'),
('2', '2', 'b', '@');
であれば、ここであなたが正しくて、私はあなたの例のスキーマを理解してきたと仮定すると、
SELECT CONCAT(t1.a,' ',t2.B,' ',t3.c)
FROM (SELECT DISTINCT A FROM docs) AS t1
CROSS JOIN (SELECT DISTINCT B FROM docs) AS t2
CROSS JOIN (SELECT DISTINCT C FROM docs) AS t3
order by t1.a, t2.b, t3.c