如何从一个表中的不同列中获取值的组合?

时间:2017-07-26 08:30:47

标签: sql oracle

我不想在表格中插入任何行,只是想获得组合结果。

例如,列是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 @

3 个答案:

答案 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

请在此处查看我的代码的工作示例:

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

答案 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