2017-07-26 60 views
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

假設我理解你的榜樣模式正確爲:

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

看到這裏我的代碼工作的例子:

http://sqlfiddle.com/#!4/91137/3

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; 
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 
相關問題