繁体   English   中英

Oracle:使用现有表中的值和新值插入行

[英]Oracle: Inserting a row using values from existing table and new values

我在将单行分为两行时遇到困难。

我的测试架构是:

CREATE TABLE T
    (id int, 
     old varchar2(24), 
     new varchar2(24))
;

其中新旧字符串是需要拆分的字符串,示例行:

  INTO T (id, old, new)
     VALUES (14, 'L-D / T-E', 'L-E / T-E')
  INTO T (id, old, new)
     VALUES (14, 'L-D / T-E', 'L-D / T-D')
  INTO T (id, old, new)
     VALUES (12, 'L-D / T-E', 'L-E / T-D')

在此示例中,“ L”已在第1行中更改,“ T”已在第2行中更改,并且两者在第3行中均已更改

该表是:

ID  OLD         NEW
14  L-D / T-E   L-E / T-E
14  L-D / T-E   L-D / T-D
12  L-D / T-E   L-E / T-D

我正在尝试将它们拆分,以使结果表针对每个重大更改具有单独的行,以使结果如下所示:

ID  OLD     NEW
1   L-D     L-E  //for existing row 1
2   T-E     T-D  //for existing row 2
//then two rows for existing row 3
3   L-D     L-E 
4   T-E     T-D

一旦插入了这些行,我便想删除现有的行。

我已经设置了sqlfiddle: http ://sqlfiddle.com/#!4/0213a/1-请记住,我在工作时会对此进行更新,因此在任何给定时间点看起来都像火车残骸。

谢谢你的帮助。

编辑更新:

我正在尝试执行此操作,但获取的数据超出了我的要求,我认为where子句存在问题:

drop table t;
CREATE TABLE T
(id int, 
 old varchar2(24), 
 new varchar2(24))
;

INSERT ALL

  INTO T (id, old, new)
     VALUES (12, 'L-D / T-E', 'L-E / T-E')
  INTO T (id, old, new)
     VALUES (13, 'L-D / T-E', 'L-D / T-D')
  INTO T (id, old, new)
     VALUES (14, 'L-D / T-E', 'L-E / T-D')



SELECT * FROM dual
;

SELECT * FROM T;

--insert into t (id, old, new) values (1,'dasdsad', 'asdasd');

BEGIN
INSERT INTO t (id,old, new) 

  WITH DATA AS
      (SELECT id,OLD, new
      FROM t
      WHERE 
      --multiple changes
      --(SUBSTR(OLD,3,1) <> SUBSTR(NEW, 3,1)
      --AND SUBSTR(OLD, 9)    <> SUBSTR(NEW, 9))
      --OR
      (--row 2
      (SUBSTR(OLD,3,1) = SUBSTR(NEW, 3,1)
      AND SUBSTR(OLD, 9)    <> SUBSTR(NEW, 9))
      )
      OR
      (--row 1
      (SUBSTR(OLD,3,1) <> SUBSTR(NEW, 3,1)
      AND SUBSTR(OLD, 9) = SUBSTR(NEW, 9))
      )
      )

    SELECT id, trim(regexp_substr(OLD, '[^/]+', 1, LEVEL)) OLD,  
           trim(regexp_substr(NEW, '[^/]+', 1, LEVEL)) NEW
    FROM DATA
      CONNECT BY LEVEL <= regexp_count(old, '/')+1;




END;
 /

输出:

    12  L-D / T-E   L-E / T-E
13  L-D / T-E   L-D / T-D
14  L-D / T-E   L-E / T-D
12  L-D L-E
12  T-E T-E
13  T-E T-D
13  L-D L-D
12  T-E T-E
13  T-E T-D

第12行的定位是3次,而应该只定位一次。

应该是简单的方法:

  • 识别要使用SUBSTR拆分的行
  • 使用REGEXP_SUBSTR分割行

标识要拆分的行:

SUBSTR(OLD,3,1) <> SUBSTR(NEW, 3,1)
   AND 
SUBSTR(OLD, 9)  <> SUBSTR(NEW, 9)

要拆分行,请查看:

例如,

SQL> WITH DATA AS
  2    (SELECT OLD
  3    FROM t
  4    WHERE SUBSTR(OLD,3,1) <> SUBSTR(NEW, 3,1)
  5    AND SUBSTR(OLD, 9)    <> SUBSTR(NEW, 9)
  6    )
  7  SELECT trim(regexp_substr(OLD, '[^/]+', 1, LEVEL)) OLD
  8  FROM data
  9    CONNECT BY LEVEL <= regexp_count(OLD, '/')+1;

OLD
------------------------
L-D
T-E

SQL>

现在,您需要做的就是使用上面的SELECT语句执行INSERT删除在此处演示的旧行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM