sql >> Database teknologi >  >> RDS >> Oracle

Markér personer, der deler fælles funktioner med Oracle SQL

Her er en måde at gøre dette på, ved at bruge en hierarkisk ("connect by") forespørgsel. Det første trin er at udtrække de indledende relationer fra basisdataene; den hierarkiske forespørgsel er bygget på resultatet fra dette første trin. Jeg tilføjede en række mere til inputs for at illustrere en node, der er en forbundet komponent i sig selv.

Du har markeret de tilsluttede komponenter som A og B - det virker selvfølgelig ikke, hvis du har f.eks. 30.000 tilsluttede komponenter. I min løsning bruger jeg minimumsnodenavnet som markør for hver tilsluttet komponent.

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
;

Output:

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

Så, hvis du har brug for at tilføje ID_GROUP som en FLAG til basisdataene, kan du gøre det med en triviel join.




  1. Oracle-syntaks – skal vi vælge mellem det gamle og det nye?

  2. Oprettelse af en Java-applikation i Oracle JDeveloper, del 2

  3. SQL Server 2008 GEOGRAPHY STDistance() værdi

  4. PG::DuplicateTable:FEJL:Relationsindlæg findes allerede