SQL: Key-Value: значения в столбцах? - PullRequest
1 голос
/ 04 августа 2011

мой стол выглядит так:

+--------------------------+
| key | value-name | value |
+-----+------------+-------+
| 1   | color      | green |
| 1   | height     | 15    |
| 2   | whatever   | lol   |
+-----+------------+-------+

и я хочу перевернуть его так, чтобы он выглядел так:

+-----+-------+--------+----------+
| key | color | height | whatever |
+-----+-------+--------+----------+
| 1   | green | 15     | ---      |
| 2   | ---   | ---    | lol      |
+-----+-------+--------+----------+

с sql вроде:

SELECT key AS k,
  (SELECT color FROM table WHERE key = k),
  (SELECT height FROM table WHERE key = k), ...

... и т. Д.

Как это можно сделать без создания подвыбора для каждого отдельного значения-имени (потому что я считаю, что это не очень быстро)?

Моя DBS - Oracle 10g.

Редактировать: впоследствии я нашел несколько примеров, но все они просто объединяются, и я не могу этого сделать, потому что в моей таблице много значений-значений.

Ответы [ 3 ]

3 голосов
/ 04 августа 2011

Сначала вы получите значения в виде отдельных столбцов, что можно сделать с помощью case, затем сгруппируйте по ключу, чтобы получить их в одной записи:

select key, max(color), max(height), max(whatever)
from (
  select
    key,
    case when value-name = 'color' then value else null end as color,
    case when value-name = 'height' then value else null end as height,
    case when value-name = 'whatever' then value else null end as whatever
  from table
) x
group by key
2 голосов
/ 04 августа 2011
select 
  key
, max( case value-name when 'color' then value else NULL end)      as color
, max( case value-name when 'heght' then value else NULL end)      as height
, max( case value-name when 'whatever' then value else NULL end)   as whatever
from 
  table
group by key
0 голосов
/ 04 августа 2011

Использовать условный CASE оператор

CASE column
 WHEN column='a' THEN 'x'
 WHEN column='b' THEN 'y'
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...