У меня есть две таблицы. Таблица Основная и Вспомогательная. Мне нужно соединить эти две таблицы. Ключи с одинаковым grp_id составляют одну группу. например: в таблице main (BWA,ST,FD62E015) — одна группа, а (BWA,VI,FD62E015) — другая группа и так далее. То же самое происходит и с другим сабвуфером стола. Теперь я хочу объединить эти две таблицы и получить grp_id из основной таблицы таким образом, чтобы, если группа с ключом (BWA, FD62E015) в подтаблице получала grp_id 1 и 2 из основной таблицы, а группа с ключом (BWA ,FM62Q011) получает grp_id 3 и 4.

Таким образом, обычные соединения здесь не будут работать, так как обе группы в подтаблице имеют ключ BWA. Есть ли способ объединить ключи и присоединиться к ним?

Table : Main 
Std_id  Grp_id  Key
1234    1       BWA            
1234    1       ST              
1234    1       FD62E015
1234    2       BWA
1234    2       VI
1234    2       FD62E015
1234    3       BWA
1234    3       ST
1234    3       FM62Q011
1234    4       BWA
1234    4       VI
1234    4       FM62Q011

Table : Sub

Std_id  Grp_id  Key
1234    1       BWA
1234    1       FD62E015
1234    2       BWA
1234    2       FM62Q011

Желаемый результат :

Std_id  sub.Grp_id  main.grp_id sub.Key
1234    1              1          BWA
1234    1              1         FD62E015
1234    1              2          BWA
1234    1              2         FD62E015
1234    2              3          BWA
1234    2              3         FM62Q011
1234    2              4         BWA
1234    2              4         FM62Q011
-1
Sangathamilan Ravichandran 4 Фев 2022 в 12:59

2 ответа

После того, как вы опубликовали желаемый результат, посмотрите, поможет ли это.

SQL> with
  2  tmain as
  3    (select std_id, grp_id, listagg(key, ',') within group (order by key) keys
  4     from main
  5     where (std_id, key) in (select std_id, key from sub)
  6     group by std_id, grp_id
  7    ),
  8  tsub as
  9    (select std_id, grp_id, listagg(key, ',') within group (order by key) keys
 10     from sub
 11     group by std_id, grp_id
 12    )
 13  select s.std_id, s.grp_id, tm.grp_id main_grp_id, s.key
 14  from sub s join tsub ts on ts.std_id = s.std_id and ts.grp_id = s.grp_id
 15             join tmain tm on tm.std_id = ts.std_id and tm.keys = ts.keys
 16  order by s.std_id, s.grp_id, tm.grp_id, s.key;

    STD_ID     GRP_ID MAIN_GRP_ID KEY
---------- ---------- ----------- --------
      1234          1           1 BWA
      1234          1           1 FD62E015
      1234          1           2 BWA
      1234          1           2 FD62E015
      1234          2           3 BWA
      1234          2           3 FM62Q011
      1234          2           4 BWA
      1234          2           4 FM62Q011

8 rows selected.

SQL>
  • tmain и tsub CTE создают новые ключи (используя функцию listagg)
  • эти новые ключи затем используются в операторе «main» select для соединения этих таблиц (наряду с «исходной» таблицей sub, чтобы получить другие значения, которые вам нужны
0
Littlefoot 4 Фев 2022 в 13:31

Использование [НЕ]СУЩЕСТВУЕТ

select *
from  main m
where EXISTS (
    select 1 
    from (select distinct Grp_id from Sub) s
    where NOT EXISTS ( 
         select 1 
         from  Sub s2
         where s2.Grp_id = s.Grp_id and NOT EXISTS ( 
             select 1 
             from  main m2
             where m2.Grp_id = m.Grp_id and s2.Key = m2.Key
             )
         )
    );

db <> скрипка

0
Serg 4 Фев 2022 в 14:05