2015-08-18 15 views
5

ich wählen Daten aus der Tabelle Employee_Master die folgenden KriterienWie spalte ich eine einzelne Zeile in mehrere Zeilen und Einfügen in eine Tabelle 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' 

Das Ergebnis Set sieht wie folgt aus.

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 

Jetzt muss ich den einen Datensatz in drei Datensätze aufgeteilt und in in Emp_history Tabelle wie folgt einfügen. EMP_SAL_ID wird aus einer anderen Tabelle abgerufen, auf die ich aufpassen kann.

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 

Ist es möglich, dies mit PL/SQL-Block oder einer anderen einfachen Methode mit Leistung zu erreichen?

+0

Geben Sie die Anweisungen create und insert an. Sie könnten ** UNION ** in diesem Fall verwenden. –

Antwort

2

Sie könnten UNION verwenden, um separate Zeilen für jeden Adresswert zu haben.

Zum Beispiel, sagen wir mal Sie eine Zeile haben, wie in der Klausel gebaut:

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> 

Nun könnte man die obige Zeile in mehrere Zeilen aufgeteilt mit UNION. Ein zusätzlicher Aufwand ist es, SUBSTR und INSTR zu verwenden, um den Namen aus emp_name zu extrahieren.

Zum Beispiel

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> 

HINWEIS:

Die MIT-Klausel wird nur verwendet, um Beispieldaten zu Demonstrationszwecken aufzubauen. In Wirklichkeit müssen Sie nur die SELECT Anweisung auf Ihrem Tisch verwenden.

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

Also, genau wie in dem von Ihnen angegebenen Beispiel, wähle ich die notwendigen Spalten aus und füge sie mit Einfügen von Auswahl ein. Ist das korrekt? – SqlNerd

+0

@SqlNerd Ja genau. 'INSERT INTO hist_table AUSWÄHLEN ...' –

+0

@downvoter Vorsicht, warum der 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

Als Variante der Antwort von 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 

Dies könnte für große Tabellen effizienter. Die große Tabelle (Daten) muss nur einmal gescannt werden.

Verwandte Themen