Oracle
 sql >> база данни >  >> RDS >> Oracle

Маркирайте лица, които споделят общи функции с Oracle SQL

Ето един начин да направите това, като използвате йерархична („свързване чрез“) заявка. Първата стъпка е да се извлекат първоначалните връзки от базовите данни; йерархичната заявка се изгражда върху резултата от тази първа стъпка. Добавих още един ред към входовете, за да илюстрирам възел, който сам по себе си е свързан компонент.

Маркирахте свързаните компоненти като A и B - разбира се, това няма да работи, ако имате, да речем, 30 000 свързани компонента. В моето решение използвам минималното име на възел като маркер за всеки свързан компонент.

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
;

Изход:

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

След това, ако трябва да добавите ID_GROUP като FLAG към базовите данни, можете да го направите с тривиално присъединяване.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получите отметната стойност от Treeview в c#?

  2. Как мога да нулирам всички последователности в моята Oracle DB на стойност 0?

  3. Актуализиране на SQL, изтриване и вмъкване едновременно

  4. таблица или изглед на oracle не съществуват от вътрешната съхранена процедура

  5. ORA-02019:описание на връзката за отдалечена база данни не е намерено