视图的不同结果 - 选择第一条记录

时间:2016-01-14 00:41:06

标签: sql oracle oracle11g

我根据孩子的属性搜索父母 我有这个视图返回父和子信息,我无法更改视图定义,因为我需要提供子信息进行过滤。 由于不同的孩子可能与同一个父母有关,因此我得不到明显的结果 如何通过使用找到的第一个子项强制SQL返回单个父结果?

例如:

parent1     foo1        child1      data a    
parent1     foo1        child3      data a    
parent2     foo2        child1      data a    
parent2     foo2        child3      data a    
parent2     foo2        child4      data a    

我很乐意得到的是:

parent1     foo1        child1      data a    
parent2     foo2        child1      data a    

示例脚本:

drop table relations;
CREATE TABLE relations(
    parent_id nchar(10) NULL,
    child_id  nchar(10) NULL
) 
drop table items;
CREATE TABLE items(
    item_id nchar(10) NULL,
    data nchar(10) NULL
);

insert into items values('parent1', 'data x');
insert into items values('parent2', 'data y');

insert into items values('child1', 'data a');
insert into items values('child2', 'data b');
insert into items values('child3', 'data a');
insert into items values('child4', 'data a');

insert into relations values('parent1', 'child1');
insert into relations values('parent1', 'child3');

insert into relations values('parent2', 'child1');
insert into relations values('parent2', 'child2');
insert into relations values('parent2', 'child3');
insert into relations values('parent2', 'child4');

drop view v_parent_child;

create  view v_parent_child as
    select rel.parent_id,parent.data as parent_data ,rel.child_id, child.data as child_data 
    from relations as rel
        join items as parent  on  rel.parent_id =  parent.item_id
        join items as child on rel.child_id = child.item_id
;


select * from v_parent_child where child_data = 'data a';

2 个答案:

答案 0 :(得分:1)

尝试以下视图。

create  view v_parent_child as
    select rel.parent_id,parent.data as parent_data ,rel.child_id, child.data as child_data 
    from ( select parent_id, 
    child_id
 from
( 
select parent_id, 
    child_id,
    row_number() over (partition by parent_id order by child_id) rn 
from relations  ) oneChild
where rn = 1 )  rel
        join items  parent  on  rel.parent_id =  parent.item_id
        join items  child on rel.child_id = child.item_id

答案 1 :(得分:1)

你可以在联接中划分分区。

select parent_id, parent_data , child_id, child_data  from (
        select *, 
        row_number() over (partition by parent_id order by parent_id) as rn
        FROM v_parent_child) t
        where t.rn = 1 ;

就像这里:Oracle 'Partition By' and 'Row_Number' keyword