2017-01-16 42 views
0

我需要计算表人员中的所有外键,并列出person_id如果外键被多次引用。如果我在一个单元格中列出所有person_id,这并不复杂。按外键分组并获取新行

例如,如果我有这样的表:

PERSON_ID | FOREIGN_KEY 
    1   a0368dwas 
    2   b65asd14s 
    3   b65asd14s 
    4   a0368dwas 
    5   cd56as46a 

我能做到这一点。SQL查询:

select listagg(person_id), ', '), foreign_key 
    from person 
    group by foreign_key 
    having count(foreign_key)>1 
    order by foreign_key 

的结果会是这样:

PERSON_ID | FOREIGN_KEY 
    1,4   z0368dwas 
    2,3   z65asd14s 

我的问题是用户要求,因为他需要person_id不是在一个行中,而是在每个person_id

所以它必须是这样的:

PERSON_ID | FOREIGN_KEY 
    1   a0368dwas 
    4   a0368dwas 
    2   b65asd14s 
    3   b65asd14s 

回答

3

这是解析函数(这有点类似于聚合函数,但不包含的行折叠成一个单排)来救援,特别是COUNT(*) OVER()解析函数:

select person, 
     foreign_key 
from (select person, 
       foreign_key, 
       count(*) over (partition by foreign_key) fk_cnt 
     from person) 
where fk_cnt > 1; 

在这里,“分区由”条款取的地方“组由”子句中的聚集查询 - 它定义行的分析函数将集去工作。您必须在子查询中执行分析函数,然后在外部查询中对结果进行筛选,因为分析函数还没有等价的“having”子句。

0

选择的人,foreign_key 从( 选择foreign_key从(选择foreign_key,通过foreign_key 数(1) 从人 集团拥有数(1)> 1) )由2

订单