Присоединиться к собственной таблице, чтобы выбрать значения - PullRequest
0 голосов
/ 10 марта 2012

У меня есть такой вид

id     name     characteristic     value     isList
1      cube         sides           6          0
1      cube         color          blue        0
2    triangle       sides           3          0
3    hexagon        (null)        (null)     (null)
4    rectangle      weight          15         0

Мне нужно выбрать все идентификаторы и имена и получить некоторые характеристики и соответствующее значение. например, я хочу получить все цифры (идентификаторы 1, 2, 3 и 4), а также характеристики сторон и цвет (если доступны, если нет, заполняются только идентификатор и имя; остальные - нулевые).

Я пытался

select *
from shapes_view
where (id = 1 or id = 2 or id = 3 or id = 4) and (characteristic like 'sides' or characteristic like 'color')

но он, очевидно, возвращает идентификаторы 1 и 2, но не 3 и 4.

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

Что я собираюсь получить, это что-то вроде

id     name     characteristic     value     isList
1      cube         sides           6          0
1      cube         color          blue        0
2    triangle       sides           3          0
3    hexagon        (null)        (null)     (null)
4    rectangle      (null)        (null)     (null)

Я знаю, что могу выбрать все значения и исключить то, что я делаю, а не то, что на стороне Java, но это звучит не очень корректно ...

Может ли кто-нибудь помочь мне в этом? С наилучшими пожеланиями

Ответы [ 2 ]

1 голос
/ 10 марта 2012

Вы можете использовать самостоятельное объединение - фактически, несколько самостоятельных объединений

select all_ids.id,
       all_ids.name,
       s.value sides,
       c.value color
  from shapes_view all_ids
       left outer join (select *
                          from shapes_view
                         where characteristic = 'sides') s
               on( s.id = all_ids.id )
       left outer join (select *
                          from shapes_view
                         where characteristic = 'color') c
               on( c.id = all_ids.id )

Или вы можете поворачивать данные

select id,
       name,
       max( case when characteristic = 'sides'
                 then value
                 else null
              end) sides,
       max( case when characteristic = 'color'
                 then value
                 else null
              end) color
  from shapes_view
 group by id, name

Сложность запросов, необходимых для извлеченияданные для N различных атрибутов - одна из причин того, что подобная модель данных общего вида атрибут-сущность обычно не одобряется.

0 голосов
/ 10 марта 2012

Может быть, я что-то упускаю, но, похоже, это все, что вам нужно:

select
  name,
  characteristic,
  case when characteristic in ('sides','color') then value else null end as value,
  case when characteristic in ('sides','color') then isList else null end as isList
from shapes_view
where id in (1,2,3,4)
and characteristic in ('sides','color')
...