【问题标题】:Display data based on data in a different table, using a case statement使用 case 语句根据不同表中的数据显示数据
【发布时间】:2016-10-06 22:01:03
【问题描述】:

我有多个表,其中一个具有 ID/Member/Type/UseDefault 列。 另一个表的列包含基于 ID 的人的描述性信息。

类型大多是默认的。在这种情况下,与 ID 对应的信息是完全可以的。如果 UseDefault 为 false(仅当类型不是默认值并且他们不想使用默认值时才会发生),那么提供的 ID 也是非常合适的。但是,如果 type 不是 default,但 use default 输入为 Yes,我需要显示与同一成员的默认 ID 关联的信息。

例如: 示例

ID  Member  Type   UseDefault

  1   joe    default    Y
  2   joe    additional Y 
  3   joe    third      N

如您所见...对于第 1 行,使用 Default 是 Yes,但类型已经是默认值。

在第 3 行,使用默认值为 No,因此您继续使用 ID 3。

但是在第 2 行。Use default 是 yes,并且 type 不是 default,所以我们需要找到 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;

【问题讨论】:

  • “joe”作为成员标识符是否是成员的唯一标识符?否则你怎么知道哪些 'joe' 行是相互关联的,哪些来自不同的 Joe's?
  • 会有其他名称,我包含该部分的唯一原因是因为会有一个带有默认值的 steve 和一个带有默认值以及其他值的 james
  • 你没有理解我的问题。会有乔布朗和乔希尔吗?你怎么知道哪个 id (多个!)与哪个 joe 一起使用?您是否还有另一列用于 member_id,以区分一个乔和另一个?
  • 您能确认一下您使用的是哪个数据库吗?您发布的代码不建议您标记的 Oracle。你从哪里得到代码?你真的试过了吗?
  • 请编辑您的帖子,使各列与数据对齐,如果/- 没有执行任何操作,请丢失它们。很难了解您的数据是什么。同样正如其他人所提到的,@idthen set 在 Oracle 中无效,而且我没有看到任何 PL/SQL。

标签: sql oracle plsql dynamic-sql


【解决方案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
;

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2015-07-13
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    相关资源
    最近更新 更多