我有一个像这样的观点
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端没有的内容,但听起来不太正确......
任何人都可以帮我这个吗? 最好的问候
答案 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')