将数据从一个表连接到另一个表

问题描述

我想将表1中的数据合并到表2中

表1

id        grp_name
-----------------------------
1       A@erf,R@erf.in
2       B@go.in,D@st.org/S@rec.uy
3       C@st.org,X@we.in,S@erl.in
4       D@gh.ou#F@rt.ot
5       E@rth.or

表2

code       name
-----------------------------------
1        A@we.ot,D@ref.as
2        B@de.in
3        C@gr.cpm
4        D@yahoo.com
5        E@erf.com
6        F@google.com

我想使用逗号(',')将grp_name数据与名称数据(例如concanate)连接起来 grp_name数据中有不需要的符号,例如“#”,“ /”,我也希望消除这些符号。

我创建了以下步骤,但我不知道我是否有效。 如果仅使用简单的update语句或merge语句是可能的,请告诉我。

例外结果

code       name
1        A@we.ot,D@ref.as,A@erf,R@erf.in
2        B@de.in,B@go.in,D@st.org,S@rec.uy
3        C@gr.cpm,C@st.org,S@erl.in
4        D@yahoo.com,D@gh.ou,F@rt.ot
5        E@erf.com,E@rth.or
6        F@google.com
CREATE OR REPLACE PROCEDURE procedure1
AS

    CURSOR cur
    IS
    SELECT id,grp_name
    FROM TABLE 1;
    
    CURSOR cur2
    IS
    SELECT code,name
    FROM TABLE 2;
    
      v_a       VARCHAR2(300);
 v_b       VARCHAR2(25);
 v_c    VARCHAR2(4000);
 v_d       VARCHAR2(250);

BEGIN

    FOR i IN cur
    LOOP
        v_a := ','||i.grp_name;
        v_b := i.id;
        
        FOR e IN cur2
        LOOP
            v_c := e.name || v_a ;
            v_d := i.code;
        
    
        UPDATE schema_name.TABLE 2
        SET name = v_c
        WHERE v_d = v_b;
        
        END LOOP;
    END LOOP;
    
--  COMMIT;
END;

解决方法

在最简单的情况下,例如@jarlh所说,您可以进行更新:

update table2
    set name = name 
            || (select ',' || regexp_replace(grp_name,'[/#]',',') -- replace / and # with,from table1
                where table1.id = table2.code)
where code in (select id from table1); -- only update matching rows

最后一行不是严格必要的,但是最好避免不必要的更新。

如果TABLE1中还有要添加的表2中不匹配的行,请使用插入符:

insert into table2 (code,name)
    select id,regexp_replace(grp_name,')
    from table1
    where id not in (select code from table2);

编辑:就像戈登提到的那样,如果您这样存储数据,则使用SQL的时间会更短:

code       name
1        A@we.ot
1        D@ref.as
1        A@erf
1        R@erf.in
2        B@de.in
2        B@go.in
2        D@st.org
2        S@rec.uy
3        C@gr.cpm
3        C@st.org
3        X@we.in
3        S@erl.in
,

请尝试以下操作:

With tab1 as
(
select 1 as id,'A@er#f,R@erf.in' as grp_name from dual union all
select 2 as id,'B@go.in,D@st.or#g/S@rec.uy' as grp_name from dual
),tab2 as (
select 1 as id,'A@we.ot,D@ref.as' as name from dual union all
select 2 as id,'B@de.in' as name from dual
)
select REGEXP_REPLACE (grp_name||','||name,'[^a-zA-Z0-9|\@|\,]','') as name from tab1 inner join tab2 using(id);

结果:

A@erf,R@erfin,A@weot,D@refas
B@goin,D@storgS@recuy,B@dein

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...