SQL:使用不同的'where'子句在同一个表中连接

时间:2010-05-19 15:40:52

标签: sql oracle pivot

好的,我面临的问题是,我有一个包含3列的表:ID,Key和Value。

ID | Key | Value
================
1  |  1  |  ab
1  |  2  |  cd
1  |  3  |  ef
2  |  1  |  gh
2  |  2  |  ij
2  |  3  |  kl

现在我想选择Keys 1&的价值。 3对于所有ID,返回应该是这样的

ID |  1  | 2
================
1  |  ab |  ef
2  |  gh |  kl

因此,每个ID 1行包含Keys 1&的值。 3。

我尝试使用'join',但由于我需要使用多个where子句,我无法弄清楚如何让它工作..

4 个答案:

答案 0 :(得分:4)

对于Oracle 8i +,请使用:

  SELECT t.id,
         MAX(CASE WHEN t.key = 1 THEN t.value ELSE NULL END) AS "1",
         MAX(CASE WHEN t.key = 2 THEN t.value ELSE NULL END) AS "2"
    FROM TABLE t
GROUP BY t.id

对于之前的Oracle版本,请将CASE交换为DECODE syntax。 Oracle直到11g才添加PIVOT语法。

答案 1 :(得分:1)

不使用数据透视查询,您也可以使用子查询加入,如下所示:

SELECT     t.id, MAX(key_1.value) AS '1', MAX(key_3.value) AS '2'
FROM       tb t
INNER JOIN (SELECT id, value FROM tb WHERE `key` = 1) key_1 ON (key_1.id = t.id)
INNER JOIN (SELECT id, value FROM tb WHERE `key` = 3) key_3 ON (key_3.id = t.id)
GROUP BY   t.id;

测试用例(在MySQL中):

CREATE TABLE tb (`id` int, `key` int, `value` char(2));
INSERT INTO tb VALUES (1, 1, 'ab');
INSERT INTO tb VALUES (1, 2, 'cd');
INSERT INTO tb VALUES (1, 3, 'ef');
INSERT INTO tb VALUES (2, 1, 'gh');
INSERT INTO tb VALUES (2, 2, 'ij');
INSERT INTO tb VALUES (2, 3, 'kl');

结果:

+------+------+------+
| id   | 1    | 2    |
+------+------+------+
|    1 | ab   | ef   |
|    2 | gh   | kl   |
+------+------+------+
2 rows in set (0.04 sec)

答案 2 :(得分:0)

为什么你不能只做三个查询?

如果我理解正确,你将不得不使用工会联盟。

答案 3 :(得分:0)

SELECT ID, VALUE AS v1, S.v2
FROM TABLE
WHERE KEY = 1
JOIN (SELECT ID, VALUE AS v2 FROM TABLE WHERE Key =3) AS S ON TABLE.ID = S.ID

如果您需要更多内容,请为每个位置添加联接...