Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在oraclesql中合并两个表_Sql_Oracle - Fatal编程技术网

在oraclesql中合并两个表

在oraclesql中合并两个表,sql,oracle,Sql,Oracle,我有两张桌子。 一是 第二桌 PART_ID AMOUNT ------ -------- 1 50 2 25 最终表格 ID REFPARTS AMOUNT -- -------- ------- 100 '1,2' 75 101 '1' 50 我怎样才能拿到最后一张桌子 提前感谢。我将逗号分隔的字符串拆分为with子句data中的行,然后与第二个表连接,并按id值分组 create t

我有两张桌子。 一是

第二桌

PART_ID    AMOUNT 
------    --------  
1            50
2            25
最终表格

ID   REFPARTS  AMOUNT
--   --------  ------- 
100   '1,2'     75
101    '1'      50
我怎样才能拿到最后一张桌子


提前感谢。

我将逗号分隔的字符串拆分为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 

这是一个可怕的数据模型。您不应该将数字ID列表存储在逗号分隔的字符串中。SQL有一种很好的表示列表的方法。它被称为表,而不是字符串

在您的情况下,您可以:

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

即使您可以使用字符串操作来完成此操作,您也应该努力修复数据模型。

这是行不通的,例如,1,2将变为1','2,并且既不匹配'1'也不匹配'2',而且类似部分中缺少%s。最好是“,”| | t1| | |“,”像“,”| | t2.partid | |“,”%@Boneist。问题中的字符串在开头和结尾都有单引号。这就是我使用这种方法的原因。谢谢你的第二点。我已经从数据中删除了单引号!
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_
  ;
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_
  ;