Je dois compter toutes les clés étrangères dans la table person et lister le person_id si la clé étrangère est mentionnée plus d'une fois. Ce n'est pas trop compliqué si je liste tous les person_id dans une cellule.

Par exemple si j'ai ce tableau:

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

Je peux faire cette requête SQL:

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

Le résultat serait comme:

    PERSON_ID | FOREIGN_KEY
    1,4         z0368dwas
    2,3         z65asd14s 

Mon problème est l'exigence de l'utilisateur, car il a besoin du person_id non pas sur une seule ligne mais sur une ligne pour chaque person_id.

Donc, ça doit être quelque chose comme ça:

    PERSON_ID | FOREIGN_KEY
    1           a0368dwas
    4           a0368dwas
    2           b65asd14s 
    3           b65asd14s 
0
Xplosio 16 janv. 2017 à 13:32

2 réponses

Meilleure réponse

C'est là que les fonctions analytiques (qui sont en quelque sorte similaires aux fonctions d'agrégation, sauf qu'elles ne réduisent pas les lignes en une seule ligne) viennent à la rescousse, en particulier la fonction analytique 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;

Ici, la clause "partition by" remplace la clause "group by" dans la requête agrégée - elle définit les ensembles de lignes sur lesquels la fonction analytique va travailler. Vous devez exécuter la fonction analytique dans une sous-requête, puis filtrer le résultat dans une requête externe, car il n'y a pas encore l'équivalent de la clause "having" pour les fonctions analytiques.

3
Boneist 16 janv. 2017 à 10:38

Sélectionnez la personne, clé_trangère De (Sélectionnez la clé_tranger de (Sélectionnez la clé_tranger, comptez (1) De la personne Groupez par clé_tranger ayant le nombre (1)> 1)) Trier par 2

0
sushant srivastav 16 janv. 2017 à 16:42