如何将单条SQL记录转换为纵向行并插入指定表中
需求与解决方案
现有表结构与数据
存在employee表,包含字段:NAME、AGE、SALARY、DESIGNATION、COURSE、JOIN_DATE,表中数据如下:
A,24,2400,Sr,Developer,10-JUN-23 B,24,2400,Jr,Developer,10-JUN-23 C,24,2400,Tr,Developer,10-JUN-23 D,24,2400,Sr,Developer,10-JUN-23
已有的查询语句
用于查询NAME为'A'的单条记录:
select * from employee where NAME='A';
需求
需要将上述查询结果的所有字段值以纵向单行的形式插入到Student_A表中,该表仅包含DETAILS字段(类型为varchar2(4000)),插入后期望结果如下:
DETAILS A 24 2400 Sr Developer 10-JUN-23
实现方案
方法1:使用UNION ALL逐个字段转换
通过UNION ALL将每个字段的值分别查询并合并为多行,注意将非字符类型(如AGE、SALARY、JOIN_DATE)转换为字符串类型:
INSERT INTO Student_A (DETAILS) SELECT NAME FROM employee WHERE NAME='A' UNION ALL SELECT TO_CHAR(AGE) FROM employee WHERE NAME='A' UNION ALL SELECT TO_CHAR(SALARY) FROM employee WHERE NAME='A' UNION ALL SELECT DESIGNATION FROM employee WHERE NAME='A' UNION ALL SELECT COURSE FROM employee WHERE NAME='A' UNION ALL SELECT TO_CHAR(JOIN_DATE, 'DD-MON-RR') FROM employee WHERE NAME='A';
方法2:使用UNPIVOT行转列(更简洁)
利用Oracle的UNPIVOT语法将原记录的列转换为行,先将所有字段统一转换为字符串类型,再进行行转列:
INSERT INTO Student_A (DETAILS) SELECT detail_value FROM ( SELECT NAME, TO_CHAR(AGE) AS AGE, TO_CHAR(SALARY) AS SALARY, DESIGNATION, COURSE, TO_CHAR(JOIN_DATE, 'DD-MON-RR') AS JOIN_DATE FROM employee WHERE NAME='A' ) UNPIVOT ( detail_value FOR detail_column IN (NAME, AGE, SALARY, DESIGNATION, COURSE, JOIN_DATE) );
两种方法都能实现需求,方法2在字段较多时更易维护,无需重复编写WHERE条件。
内容的提问来源于stack exchange,提问作者memotib827
相关产品推荐
相关产品推荐

