如何将表的一行插入另一个表的两行

时间:2018-05-29 10:43:50

标签: sql oracle

我在Table1中有一条记录,我希望将这一条记录分成两行并插入另一个表Table2。

表1

ID  Date      User       value
1   29/05/18   XXX   X_ID||X_value||22||xx
2   29/05/18   YYY   Y_ID||Y_value||33|yy

我想将table1值作为

插入到table2中

表2

P_ID ID Date       User   Field    Value
 1   1  29/05/18    XXX    X_ID     22
 2   1  29/05/18    XXX    X_Value  XX
 3   2  29/05/18    YYY    Y_ID     33
 4   3  29/05/18    YYY    Y_Value  YY

table1中的值是table2中的字段,没有任何东西可以硬编码,因为我在表table1中有很多记录。 编辑:如果table1中的值有更多的值,如X_ID || X_VALUE || Y_ID || Y_Value || 22 || xx || 33 || yy,该怎么办?如何使此查询动态化,以便与输出无关,它将table2的不同行中的记录分开

2 个答案:

答案 0 :(得分:1)

您可以使用regexp_substr()

select id, date, user, regexp_substr(val, '[^|]+', 1, 1) as field, regexp_substr(val, '[^|]+', 1, 3) as value
from table1
union all
select id, date, user, regexp_substr(val, '[^|]+', 1, 2) as field, regexp_substr(val, '[^|]+', 1, 4) as value
from table1;

您可以使用insert将其放入另一个表格中。这假定自动分配p_id。如果您想自己分配,可以使用row_number()

select row_number() over (partition by id order by which) as p_id,
       id, date, user, field, value
from ((select id, date, user, regexp_substr(val, '[^|]+', 1, 1) as field, regexp_substr(val, '[^|]+', 1, 3) as value, 1 as which
       from table1
      ) union all
      (select id, date, user, regexp_substr(val, '[^|]+', 1, 2) as field, regexp_substr(val, '[^|]+', 1, 4) as value, 2 as which
       from table1
      )
     ) t

答案 1 :(得分:0)

我试图通过使用游标来解决问题。

DECLARE @ID INT

DECLARE @NAME VARCHAR(50)

DECLARE @DATE DATE

DECLARE @VALUE VARCHAR(500)

DECLARE @List TABLE(item NVARCHAR(MAX))

宣告@SELECTCURSOR CURSOR

SET @SELECTCURSOR = CURSOR FOR SELECT * FROM tempTable1

OPEN @SELECTCURSOR

FETCH NEXT FROM @SELECTCURSOR INTO @ ID,@ DATE,@ NAME,@ VALUE

WHILE @@ FETCH_STATUS = 0

BEGIN

SET @VALUE =替换(@VALUE,' ||','。');

INSERT INTO tempTable2(ID,[User],[Date],Field,Value)VALUES(@ ID,@ NAME,@ DATE,ParseName(@ VALUE,4),PARSENAME(@ VALUE,2))

INSERT INTO tempTable2(ID,[User],[Date],Field,Value)VALUES(@ ID,@ NAME,@ DATE,ParseName(@ VALUE,3),PARSENAME(@ VALUE,1))

FETCH NEXT FROM @SELECTCURSOR INTO @ ID,@ DATE,@ NAME,@ VALUE

END

关闭@SELECTCURSOR

DEALLOCATE @SELECTCURSOR