我不想在表中插入任何行,但只想獲得組合結果。如何獲得一個表中不同列的值的組合?
例如,列是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 @
我不想在表中插入任何行,但只想獲得組合結果。如何獲得一個表中不同列的值的組合?
例如,列是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 @
假設我理解你的榜樣模式正確爲:
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', '@');
那麼你可以做:
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操作,該操作會生成兩個表的笛卡爾乘積 - 即每行與每隔一行匹配一次。這是SQL的一個較少使用的部分。這裏有它的一個很好的解釋: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;
您可以使用同一個表交叉連接。這裏是fiddle
如果模式是
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