使用case语句基于不同表中的数据显示数据

时间:2016-10-06 22:01:04

标签: sql oracle plsql dynamic-sql

我有多个表,其中一个表有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;

1 个答案:

答案 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
;