2015-08-18 40 views
5

我使用下面的查詢如何將單個行分成多行並插入到Oracle中的表中?

SELECT EMP_ID 
, EMP_NAME 
, EMP_LOC1 
, EMP_LOC2 
, EMP_LOC3 
, EMP_DESG 
, EMP_ADDR1 
, EMP_ADDR2 
, EMP_ADDR3 
, EMP_PHNO 
, EMP_STATUS 
FROM Employee_Master 
WHERE EMP_STATUS = 'A' 

結果集看起來像這樣選擇表Employee_Master數據。

EMP_ID   EMP_NAME   EMP_LOC1  EMP_LOC2 EMP_LOC3 EMP_DESG EMP_ADDR1 EMP_ADDR2 EMP_ADDR3 EMP_PHNO EMP_STATUS 
    23  Covey, Stephen J, Mr  1   2   4  Writer  3   3   3   11   A 
    24  Jhon, Abraham A, Mr  1   2   4  Actor  1   1   1   22   A 

現在我要一個記錄分成三個記錄,並插入到Emp_history表是這樣的。 EMP_SAL_ID是從我可以照顧的不同表中提取的。

EMP_SAL_ID First_Name Middle_Initial Last_Name Title Designation Location Address Phone_No Status 
     3456  Stephen   J   Covey  Mr  Writer  1   3  11   A 
     3456  Stephen   J   Covey  Mr  Writer  2   3  11   A 
     3456  Stephen   J   Covey  Mr  Writer  4   3  11   A 

是否可以使用PL/SQL塊或任何其他具有性能的簡單方法實現此目的?

+0

請提供創建和插入語句。在這種情況下,您可以使用** UNION **。 –

回答

2

您可以使用UNION爲每個地址值分別設置行。

例如,假設你有一個行作爲建在與子句:

SQL> WITH DATA(EMP_NAME,EMP_ADDR1,EMP_ADDR2,EMP_ADDR3) AS(
    2 SELECT 'Covey, Stephen J, Mr', 1, 2, 4 FROM DUAL UNION ALL 
    3 SELECT 'Jhon, Abraham A, Mr ', 1, 2, 4 FROM DUAL 
    4 ) 
    5 SELECT * FROM DATA; 

EMP_NAME    EMP_ADDR1 EMP_ADDR2 EMP_ADDR3 
-------------------- ---------- ---------- ---------- 
Covey, Stephen J, Mr   1   2   4 
Jhon, Abraham A, Mr   1   2   4 

SQL> 

現在你可以在上面一行拆分爲使用UNION多行。只是額外的努力是使用SUBSTRINSTR從emp_name中提取名稱。

例如,

SQL> WITH DATA(EMP_NAME,EMP_ADDR1,EMP_ADDR2,EMP_ADDR3) AS(
    2 SELECT 'Covey, Stephen J, Mr', 1, 2, 4 FROM DUAL UNION ALL 
    3 SELECT 'Jhon, Abraham A, Mr ', 1, 2, 4 FROM DUAL 
    4 ) 
    5 SELECT SUBSTR(emp_name, instr(emp_name, ',', 1, 1)+1, instr(emp_name, ' ', 1, 2) - instr(emp_name, ',', 1, 1)) AS "ename", 
    6 emp_addr1                         AS "addr" 
    7 FROM DATA 
    8 UNION ALL 
    9 SELECT SUBSTR(emp_name, instr(emp_name, ',', 1, 1)+1, instr(emp_name, ' ', 1, 2) - instr(emp_name, ',', 1, 1)), 
10 emp_addr2 
11 FROM DATA 
12 UNION ALL 
13 SELECT SUBSTR(emp_name, instr(emp_name, ',', 1, 1)+1, instr(emp_name, ' ', 1, 2) - instr(emp_name, ',', 1, 1)), 
14 emp_addr3 
15 FROM DATA 
16/

ename      addr 
-------------------- ---------- 
Stephen      1 
Abraham      1 
Stephen      2 
Abraham      2 
Stephen      4 
Abraham      4 

6 rows selected. 

SQL> 

WITH子句僅用於構建樣本數據用於演示目的。在實際情況中,您只需在表格上使用SELECT聲明。

INSERT INTO hist_table SELECT statement as shown above... 
+0

所以,就像您給出的示例一樣,我選擇必要的列並使用select中的insert來插入它。那是對的嗎? – SqlNerd

+0

@SqlNerd是的。 'INSERT INTO hist_table選擇...' –

+0

@downvoter謹慎解釋爲什麼downvote? –

0
create table adress_test(ename varchar2(30), addr number); 


insert all 
    into adress_test values(SUBSTR(emp_name, instr(emp_name, ',', 1, 1)+1, instr(emp_name, ' ', 1, 2) - instr(emp_name, ',', 1, 1)), emp_addr1) 
    into adress_test values(SUBSTR(emp_name, instr(emp_name, ',', 1, 1)+1, instr(emp_name, ' ', 1, 2) - instr(emp_name, ',', 1, 1)),emp_addr2) 
    into adress_test values(SUBSTR(emp_name, instr(emp_name, ',', 1, 1)+1, instr(emp_name, ' ', 1, 2) - instr(emp_name, ',', 1, 1)),emp_addr3) 

    SELECT 'Covey, Stephen J, Mr' EMP_NAME , 1 EMP_ADDR1, 2 EMP_ADDR2, 4 EMP_ADDR3 FROM DUAL UNION ALL 
    SELECT 'Jhon, Abraham A, Mr ', 1, 2, 4 FROM DUAL 
; 
0

由於從拉利特對答案的變化:

WITH DATA(EMP_NAME,EMP_ADDR1,EMP_ADDR2,EMP_ADDR3) AS(
    SELECT 'Covey, Stephen J, Mr', 1, 2, 4 FROM DUAL UNION ALL 
    SELECT 'Jhon, Abraham A, Mr ', 1, 2, 4 FROM DUAL 
), 
a as (select 1 as n from dual 
    union all select 2 as n from dual 
    union all select 3 as n from dual) 
select emp_name, case a.n 
        when 1 then emp_addr1 
        when 2 then emp_addr2 
        when 3 then emp_addr3 end as emp_addr 
from data inner join a on 1=1 

這可能是大表更有效。大表(數據)只需掃描一次。

相關問題