Oracle
 sql >> Base de données >  >> RDS >> Oracle

Signaler les personnes qui partagent des fonctionnalités communes avec Oracle SQL

Voici une façon de le faire, en utilisant une requête hiérarchique (« se connecter par »). La première étape consiste à extraire les relations initiales des données de base ; la requête hiérarchique est construite sur le résultat de cette première étape. J'ai ajouté une ligne supplémentaire aux entrées pour illustrer un nœud qui est un composant connecté par lui-même.

Vous avez marqué les composants connectés comme A et B - bien sûr, cela ne fonctionnera pas si vous avez, disons, 30 000 composants connectés. Dans ma solution, j'utilise le nom de nœud minimum comme marqueur pour chaque composant connecté.

with
  sample_data (id, feature) as (
    select 1,  1 from dual union all
    select 1,  2 from dual union all
    select 1,  3 from dual union all
    select 2,  3 from dual union all
    select 2,  4 from dual union all
    select 2,  6 from dual union all
    select 3,  5 from dual union all
    select 3, 10 from dual union all
    select 3, 12 from dual union all
    select 4, 12 from dual union all
    select 4, 18 from dual union all
    select 5, 10 from dual union all
    select 5, 30 from dual union all
    select 6, 40 from dual
  )
-- select * from sample_data; /*
, initial_rel(id_base, id_linked) as (
    select distinct s1.id, s2.id
      from sample_data s1 join sample_data s2
                          on s1.feature = s2.feature and s1.id <= s2.id
  )
-- select * from initial_rel; /*
select     id_linked as id, min(connect_by_root(id_base)) as id_group
from       initial_rel
start with id_base <= id_linked
connect by nocycle prior id_linked = id_base and id_base < id_linked
group by   id_linked
order by   id_group, id
;

Sortie :

     ID   ID_GROUP
------- ----------
      1          1
      2          1
      3          3
      4          3
      5          3
      6          6

Ensuite, si vous devez ajouter ID_GROUP en tant que FLAG aux données de base, vous pouvez le faire avec une jointure triviale.