Oracle - 基于多个值的查询

时间:2018-01-23 20:00:28

标签: sql oracle

我在Oracle中存在2列数据。

Name                ID
Default             123
Arod                234
Default             589
Green               589

我需要根据 -

编写查询

1)当每个ID存在多个记录时,我需要提取非默认记录。在这种情况下,我需要使用Name" Green"提取记录。对于ID 589.每个ID最多存在2条记录,其中一条默认为

2)当每个ID存在单个记录时,我只需要填充与该ID相关联的名称。

任何指针都将非常感激。

3 个答案:

答案 0 :(得分:1)

您可以使用union all和其他一些逻辑执行此操作:

select t.*
from t
where t.name = 'Default' and
      not exists (select 1 from t t2 where t2.id = t.id and t2.name <> t.name)
union all
select t.*
from t
where t.name <> 'Default' ;

这里的逻辑是你总是采用非默认名称。如果不存在其他名称,则使用默认名称。

另一种处理此类查询的方法是使用row_number()

select t.*
from (select t.*,
             row_number() over (partition by id order by case when name = 'Default' then 2 else 1 end) as seqnum
      from t
     ) t
where seqnum = 1;

答案 1 :(得分:0)

您可能希望隐藏ID背后的数据访问的复杂性。

create view my_view as select id, max(case when name != 'Default' then name end) name, max(case when name = 'Default' then name end) default_name, case when count(*) > 2 then 'Invalid ID, count '||count(*) end as status from tab group by id; select * from my_view order by id; ID NAME DEFAULT_NAME STATUS ---------- ------- ------------ ---------------------------------------------------------- 123 Default 234 Arod 589 Green Default 700 Beatrix Default 上的视图主键,并返回两列中的值和默认值。此外,视图检查数据的一致性 - 在您的情况下,每个ID只允许两个记录(参见列状态)

NVL

查询数据非常简单,只需使用NAMEDEFAULT_NAME上的select id, nvl(NAME, DEFAULT_NAME) name from my_view order by id; ID NAME ---------- ------- 123 Default 234 Arod 589 Green 700 Beatrix

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

答案 2 :(得分:0)

这更像是一个反例&#34;您可能不应该使用,因为Gordon已经提供了智能解决方案。

尽管如此,我有点无聊并且有时间闲暇,试图找到另一种方法来选择你需要的价值。所以 - 你在这里。

CASE说:如果只有一个名字,那么&#34;默认&#34;,那就接受它。否则,转换&#34;默认&#34;到一个空字符串并选择剩余的名称(该ID将为MAX)。

SQL> with test (name, id) as
  2  (select 'Default', 123 from dual union
  3   select 'Arod'   , 234 from dual union
  4   select 'Default', 589 from dual union
  5   select 'Green'  , 589 from dual union
  6   select 'Default', 700 from dual union
  7   select 'Beatrix', 700 from dual
  8  )
  9  select id,
 10    case when count(distinct name) = 1 and
 11              max(name) = 'Default'
 12              then 'Default'
 13         else
 14           max(replace(name, 'Default', ''))
 15         end name
 16  from test
 17  group by id
 18  order by id;

        ID NAME
---------- -------
       123 Default
       234 Arod
       589 Green
       700 Beatrix

SQL>