我不想在表格中插入任何行,只是想获得组合结果。
例如,列是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 @
答案 0 :(得分:2)
假设我已正确理解您的示例架构:
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
请在此处查看我的代码的工作示例:
答案 1 :(得分:0)
我们的表格:
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;
答案 2 :(得分:0)
您可以在同一张桌子上使用交叉连接。这是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