【问题标题】:Group by foreign Key and get new row按外键分组并获取新行
【发布时间】:2017-01-16 10:32:44
【问题描述】:

如果外键被多次引用,我需要计算人员表中的所有外键并列出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 

【问题讨论】:

    标签: sql oracle having listagg


    【解决方案1】:

    这就是分析函数(类似于聚合函数,除了它们不会将行折叠成一行)来救援的地方,特别是 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”子句——它定义了分析函数将要处理的行集。您必须在子查询中执行分析函数,然后在外部查询中过滤结果,因为对于分析函数还没有等效的“having”子句。

    【讨论】:

      【解决方案2】:

      选择人,foreign_key 从 ( 从 (Select foreign_key , count(1) 中选择 foreign_key 从人 按foreign_key分组 计数(1) > 1) ) 2人下单

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-14
        • 2019-02-04
        • 1970-01-01
        • 2023-03-13
        • 2014-03-16
        • 1970-01-01
        相关资源
        最近更新 更多