SQL: объединить в одной таблице с другим предложением 'where' - PullRequest
2 голосов
/ 19 мая 2010

Хорошо, проблема в том, что я сталкиваюсь с тем, что у меня есть таблица с 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

Теперь я хочу выбрать значение ключей 1 и 3 для всех идентификаторов, возвращаемое значение должно быть таким:

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

То есть для строки ID 1, содержащей значения для ключей 1 и 3.

Я пытался использовать 'join', но так как мне нужно использовать несколько операторов where, я не могу понять, как заставить это работать ..

Ответы [ 4 ]

4 голосов
/ 19 мая 2010

Для 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 синтаксис . Oracle не добавлял синтаксис PIVOT до 11 г.

1 голос
/ 19 мая 2010

Без использования сводных запросов вы также можете присоединиться к подзапросу следующим образом:

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)
0 голосов
/ 19 мая 2010
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

Если вам нужно больше, добавьте объединение для каждого, где ...

0 голосов
/ 19 мая 2010

Почему вы не можете просто сделать три запроса?

Если я вас правильно понимаю, вам придется использовать профсоюз.

...