在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_
;