2017-01-16 70 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

訂單