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 
4

2 回答 2

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;

在这里,“partition by”子句代替了聚合查询中的“group by”子句——它定义了分析函数将要处理的行集。您必须在子查询中执行分析函数,然后在外部查询中过滤结果,因为对于分析函数还没有等效的“具有”子句。

于 2017-01-16T10:38:49.873 回答
0

Select person, foreign_key From ( Select foreign_key from (Select foreign_key , count(1) From person Group by foreign_key 有count(1) > 1) ) 按2排序

于 2017-01-16T16:42:56.343 回答