Объединить две таблицы в Oracle Sql - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть две таблицы. Одним из них является

ID   REFPARTS  
--   --------   
100   '1,2'   
101    '1'    

Второй стол

PART_ID    AMOUNT 
------    --------  
1            50
2            25

Финальный стол

ID   REFPARTS  AMOUNT
--   --------  ------- 
100   '1,2'     75
101    '1'      50

Как мне получить финальный стол?

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Это ужасная модель данных. Вы не должны хранить списки числовых идентификаторов в строке через запятую. У SQL есть замечательный способ представления списков. Он называется «таблица», а не «строка».

В вашем случае вы можете сделать:

select t1.id, sum(t2.amount)
from table1 t1 join
     table2 t2
     on replace(t1.refparts, ',', ''',''') like '%''' || t2.partid || '''%'
group by t1.id;

Даже если вы можете сделать это, используя манипуляции со строками, вы должны приложить усилия для исправления модели данных.

0 голосов
/ 09 ноября 2018
WITH tab1 AS ( 
  SELECT 100 AS id_, '1,2' AS refparts FROM dual 
   UNION ALL
  SELECT 101 AS id_, '1'   AS refparts FROM dual 
),
tab2 AS (
  SELECT 1 AS part_id , 50 AS amount  FROM dual 
   UNION ALL
  SELECT 2 AS part_id , 25 AS amount  FROM dual 
)
SELECT t1.id_, t1.refparts, SUM(t2.amount)
  FROM (
        SELECT DISTINCT id_, trim(regexp_substr(refparts, '[^,]+', 1, LEVEL)) refparts
          FROM tab1
          CONNECT BY instr(refparts, ',', 1, LEVEL - 1) > 0
       ) t1Splited
 INNER JOIN tab1 t1 ON t1.id_     = t1Splited.id_
 INNER JOIN tab2 t2 ON t2.part_id = t1Splited.refparts
 GROUP BY t1.id_, t1.refparts
 ORDER BY t1.id_
  ;
0 голосов
/ 09 ноября 2018

Я разделяю разделенную запятыми строку на строки в моем предложении with «data», затем следует объединение со второй таблицей и группировка по значениям id.

create table t(id int, refparts varchar2(100))

insert into t values(100,'1,2');
insert into t values(101,'1');

create table t2(part_id int, amount int);

insert into t2 values(1,50);
insert into t2 values(2,25);

with data
  as (
select a.id
       ,rtrim(
        substr(a.refparts|| ','
               ,instr(','||a.refparts||',',',',1,lvl)
               ,instr(','||a.refparts||',',',',1,lvl+1) - instr(','||a.refparts||',',',',1,lvl)
                  )
            ,',') as col2
  from t a
  join (select level as lvl
          from dual
        connect by level<=10) b
     on b.lvl <=length(a.refparts) - length(replace(a.refparts,',','')) + 1        
     )
select a.id
       ,sum(b.amount) as summed_val
  from data a
  join t2 b
    on a.col2=b.part_id
group by a.id 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...