[英]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(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.