加入自己的表来选择值

时间:2012-03-10 03:15:23

标签: sql oracle select join view

我有一个像这样的观点

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

我需要选择所有ID和名称,并检索一些特征和相应的值。例如,我想要检索所有数字(ID 1,2,3和4)以及特征边和颜色(如果可用,如果没有,只填充id和名称;其他为空)。

我试过

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

但显然它会检索ID 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 个答案:

答案 0 :(得分:1)

您可以使用自联接 - 实际上是一些自我加入

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个不同属性提取数据所需的查询的复杂性是这种非常通用的实体 - 属性 - 值数据模型通常不受欢迎的原因之一。

答案 1 :(得分:0)

也许我错过了什么,但听起来这就是你所需要的:

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')