我Employee_Master使用以下查询从表中选择数据
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'
Run Code Online (Sandbox Code Playgroud)
结果集如下所示.
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
Run Code Online (Sandbox Code Playgroud)
现在我必须将一条记录拆分为三条记录并插入到这样的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
Run Code Online (Sandbox Code Playgroud)
是否可以使用PL/SQL块或任何其他具有性能的简单方法来实现此目的.
您可以使用UNION为每个地址值设置单独的行。
例如,假设您有一个在 with 子句中内置的行:
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>
Run Code Online (Sandbox Code Playgroud)
现在您可以使用UNION将上面的行拆分为多行。只需额外的努力就是使用SUBSTR和INSTR从 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>
Run Code Online (Sandbox Code Playgroud)
笔记:
WITH子句仅用于构建示例数据以用于演示目的。在实际情况中,您只需在表上使用SELECT语句即可。
INSERT INTO hist_table SELECT statement as shown above...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1666 次 |
| 最近记录: |