2015-08-18 14 views
5

I selezionare i dati dalla tabella Employee_Master utilizzando la query di seguitoCome dividere una singola riga in più righe e inserirla in una tabella in 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' 

il set di risultati simile a questa.

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 

Ora devo dividere il un record in tre dischi ed inserisci in in Emp_history tavola come questo. EMP_SAL_ID viene prelevato da una tabella diversa di cui posso occuparmi.

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 

È possibile ottenere ciò utilizzando il blocco PL/SQL o qualsiasi altro metodo semplice con prestazioni.?

+0

Fornire le istruzioni di creazione e inserimento. In questo caso potresti usare ** UNION **. –

risposta

2

È possibile utilizzare UNION per disporre di righe separate per ciascun valore di indirizzo.

Ad esempio, supponiamo che abbiate una riga come costruita nella clausola:

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> 

Ora si potrebbe dividere la riga sopra in più righe utilizzando UNION. Un ulteriore sforzo è quello di utilizzare SUBSTR e INSTR per estrarre il nome da emp_name.

Per esempio,

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> 

NOTA:

Il CON clausola viene utilizzata solo per costruire i dati di esempio a scopo dimostrativo. In realtà, è sufficiente utilizzare la dichiarazione SELECT SELECT sul tuo tavolo.

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

Quindi, proprio come nell'esempio che hai dato, seleziono le colonne necessarie e lo inserisco usando insert da select. è corretto? – SqlNerd

+0

@SqlNerd Sì esattamente. 'INSERISCI IN hist_table SELEZIONA ...' –

+0

@downvoter Ti interessa spiegare perché il 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

come una variazione sul risposta da Lalit:

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 

Questo potrebbe essere più efficiente per tabelle di grandi dimensioni. La grande tabella (dati) deve essere scansionata una sola volta.

Problemi correlati