我在Oracle中存在2列数据。
Name ID
Default 123
Arod 234
Default 589
Green 589
我需要根据 -
编写查询1)当每个ID存在多个记录时,我需要提取非默认记录。在这种情况下,我需要使用Name" Green"提取记录。对于ID 589.每个ID最多存在2条记录,其中一条默认为
2)当每个ID存在单个记录时,我只需要填充与该ID相关联的名称。
任何指针都将非常感激。
答案 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
查询数据非常简单,只需使用NAME
和DEFAULT_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>