我有多个表,其中一个表有ID / Member / Type / UseDefault。 另一个表具有基于ID的关于人的描述性信息的列。
类型主要是defualt。在这种情况下,与ID对应的信息非常好。如果UseDefault为false(仅当类型IS不是defualt且它们不想使用默认值时才会发生),那么提供的ID也非常合适。但是,如果type不是默认值,但使用default则输入Yes,我需要显示与同一成员的默认ID相关联的信息。
例如: 实施例
ID Member Type UseDefault
1 joe default Y
2 joe additional Y
3 joe third N
正如您所看到的......对于第1行,使用Default是Yes,但类型已经是默认值。
在第3行中,使用默认值为“否”,因此您继续使用ID 3。
但是在第2行中。使用default是yes,并且类型不是默认类型,因此我们需要找到Joe的默认类型行。这是另一个表,以及我查询的预期输出。
信息
ID Car Color Food
1 Benz Red Pizza
2 Ferrari Green Cheese
3 Minivan Orange Hamburger
expected output:
Output
ID Car Color Food
1 Benz Red Pizza
1 Benz Red Pizza
3 Minivan Orange Hamburger
基本上我有
declare
id varchar2(2000)
Select I.Car, I.Color, I.FavoriteFood
from Info I
full outer join Example e on e.id = i.id
where case id:= when (e.useDefault = 'N' AND e.Type <> 'Default') then (select id from example where e.name = name and e.type = default) else e.type end
and i.id = @id;
答案 0 :(得分:1)
with
inputs ( id, member, type, usedefault ) as (
select 1, 'joe', 'default' , 'Y' from dual union all
select 2, 'joe', 'additional', 'Y' from dual union all
select 3, 'joe', 'third' , 'N' from dual
),
info ( id, car, color, food ) as (
select 1, 'Benz' , 'Red' , 'Pizza' from dual union all
select 2, 'Ferrari', 'Green' , 'Cheese' from dual union all
select 3, 'Minivan', 'Orange', 'Hamburger' from dual
),
defaults ( id, member ) as (
select id, member
from inputs
where type = 'default'
),
prep ( id_to_use ) as (
select case when i.usedefault = 'N' then i.id
else d.id end as id_to_use
from inputs i inner join defaults d on i.member = d.member
)
select p.id_to_use as id, i.car, i.color, i.food
from prep p left outer join info i on p.id_to_use = i.id
;