У меня есть таблица, как показано ниже, в которой будет описание продукта.

╔════╦══════════════╦══════╗
║ Id ║  name        ║ price║
╠════╬══════════════╬══════╣
║  1 ║ Apple        ║ 23   ║
║  2 ║ shirt        ║  148 ║
║  3 ║ computer     ║  101 ║
║  4 ║ printer      ║  959 ║
╚════╩══════════════╩══════╝

И еще одна таблица, которая содержит атрибуты, связанные, например, с идентификатором.

╔════╦══════════════╦══════╗
║ Id ║  attr_name   ║ Value║
╠════╬══════════════╬══════╣
║  1 ║ color        ║ red  ║
║  1 ║ size         ║  xl  ║
║  1 ║ brand        ║  App ║
║  2 ║ color        ║  blue║
║  2 ║ size         ║  l   ║
║  3 ║ color        ║  blue║
║  3 ║ size         ║  xxl ║
║  3 ║ brand        ║  HP  ║
╚════╩══════════════╩══════╝

Есть ли какой-либо способ создать таблицу, как показано ниже, если я знаю, что имя атрибута будет только размером цвета и торговой марки

╔════╦══════════╦═══════╦═══════╦══════╦══╗
║ id ║   name   ║ color ║ brand ║ size ║  ║
╠════╬══════════╬═══════╬═══════╬══════╬══╣
║  1 ║ apple    ║ red   ║ app   ║ xl   ║  ║
║  2 ║ shirt    ║ blue  ║       ║ l    ║  ║
║  3 ║ computer ║ blue  ║ HP    ║ XXL  ║  ║
║  4 ║ printer  ║       ║       ║      ║  ║
╚════╩══════════╩═══════╩═══════╩══════╩══╝
4
user3199077 17 Фев 2014 в 22:38
Вы действительно хотите объединить таблицы или хотите, чтобы запрос отображал эти значения?
 – 
Patrick Hofman
17 Фев 2014 в 22:41
Я хотел бы запросить эти значения, чтобы я мог создать из них новую таблицу.
 – 
user3199077
17 Фев 2014 в 22:42
Для этой структуры используется термин "EAV" .
 – 
user2864740
17 Фев 2014 в 22:45
Какая версия Oracle?
 – 
Taryn
17 Фев 2014 в 22:48

1 ответ

Лучший ответ

Вы должны иметь возможность использовать агрегатную функцию с выражением CASE для преобразования строк в столбцы:

select d.id,
  d.name,
  max(case when a.attr_name = 'color' then a.value end) color,
  max(case when a.attr_name = 'brand' then a.value end) brand,
  max(case when a.attr_name = 'size' then a.value end) size
from product_description d
inner join product_attributes a
  on d.id = a.id
group by d.id, d.name;

См. SQL Fiddle с демонстрацией.

Поскольку вы используете Oracle 11g, вы можете использовать функцию PIVOT для получения результата:

select id, name, Color, Brand, "Size"
from
(
  select d.id, d.name,
    a.attr_name, a.value
  from product_description d
  inner join product_attributes a
    on d.id = a.id
) src
pivot
(
  max(value)
  for attr_name in ('color' as Color,
                    'brand' as Brand,
                    'size' as "Size")
) p;

См. SQL Fiddle с демонстрацией

2
Taryn 17 Фев 2014 в 23:03