繁体   English   中英

Oracle 11 SQL:将 1 行拆分为 x 行并插入新列

[英]Oracle 11 SQL : Split 1 row into x rows and insert a new column

我问Oracle 11 SQL:有没有办法将 1 行拆分为 x 行——这个问题非常接近,但有一个小转折......

客户要求将 Oracle DB SQL 中的 1 行拆分为 6 行。

比方说,最初的 SQL(具有多个连接的复杂 sql 等)正在拉入 9 列:

select A, B, C, D, E, F, G, H, I  
   from X, Y, Z . . .

(但相当复杂的查询)

1) A, B, C, D, E, F, G, H, I.

现在,客户要求每一行返回模式,新的输出应该如下所示:

1) A, B, C, 'Name for D : ', D  
2) A, B, C, 'Name for E : ', E  
3) A, B, C, 'Name for F : ', F  
4) A, B, C, 'Name for G : ', G  
5) A, B, C, 'Name for H : ', H  
6) A, B, C, 'Name for I : ', I  

基本上,第 1 个 3 列值将在所有 6 个新行中重复。
新行中的第 4 列将是一个字符串,表示第 5 列的内容。

该过程对原始查询中的每一行重复。

从之前的答案中,我知道 unpivot 可以做到这一点——只是无法自己解决这个问题。

更新:

实际上,我在我的问题中并不清楚我想要的第 4 列的输出不是直接连接。 如果是这样的话,我本可以自己做的。 这些值不是 D、E、F、G、H、I 的文字串联。
D、E、F、G、H、I 的第 4 列值如下? :列侬、保罗·麦卡特尼、林戈·斯塔尔、乔治·哈里森、皮特·贝斯特、汤米·摩尔

所以,输出现在看起来像:

1) A, B, C, 'Lennon : ', D  
2) A, B, C, 'paul McCartney : ', E  
3) A, B, C, 'Ringo Starr : ', F  
4) A, B, C, 'George Harrison : ', G  
5) A, B, C, 'Pete Best : ', H  
6) A, B, C, 'Tommy Moore : ', I  

我希望您明白第 4 列的值可以是任何字符串,而不是第 5 列的派生词。

更新2:
假设,为了说明目的,我的复杂查询可以简化为经典的 Oracle 表

假设,我在这些 Emp 和 Dept 表上运行此 SQL:

select emp.empno, emp.ename, emp.job, emp.mgr, emp.hiredate, emp.sal , dept.deptno, dept.dname, dept.loc from emp, dept where emp.deptno = dept.deptno;  

就我而言,第 4 列将是“mgr”、“hiredate”、“sal”、“deptno”、“dname”和“loc”。

因此,例如,对于来自上述查询的以下(原始)结果行:
empno、ename、job、mgr、hiredate、sal、deptno、dname、loc
7698, BLAKE, 经理, 7839, 1981-05-01, 2850.00, 30, 销售, 芝加哥

新的6 行将是
7698 布莱克经理经理 7839
7698 BLAKE MANAGER 聘用 1981-05-01
7698 布莱克经理萨尔 2850.00
7698 布莱克经理部门 30
7698 BLAKE MANAGER dname 销售
7698 BLAKE MANAGER loc CHICAGO

我应该怎么做才能转换上述 SQL 以获得上述新的6 行?

您可以使用 unpivot 子句。 我认为这段代码会帮助你:

select a,b,c,'Name for ' || name_code || ' : '|| name_code as value  from 
(select 'A' a ,'B' b ,'C' c ,'D' d,'E' e,'F' f,'G' g,'H' h,'I' i from dual) 
unpivot include nulls 
(
name_for for name_code in (d as 'D', e as 'E' ,f as 'F',g as 'G',h  as 'H',i as 'I') 
);

问题更新后。 答案改成这样:

select A,B,C,'Name for ' || name_for  as value, name_code  from 
(select 1 A,2 B,3 C,'Lennon' D,'Paul McCartney' E, 'Ringo Starr' F, 
              null G, 'Pete Best'H, 'Tommy Moore'  I from dual )
unpivot include nulls 
(
name_for for name_code in (d,e,f,g,h,i) 
)

您可以将unpivotconcat()函数concat( concat('Name for ',val),' : ')或连接运算符 ( || ) 用作'Name for '||val||' : ' 'Name for '||val||' : ' :

with t(a,b,c,d,e,f,g,h,i) as
(
 select 1,2,3,'Lennon','Paul McCartney', 'Ringo Starr', 
              null, 'Pete Best', 'Tommy Moore' 
   from dual 
)
select a,b,c, concat( concat('Name for ',val),' : ') as explanation,
       col 
  from
  (
   select nvl(to_char(a),' ') as a, nvl(to_char(b),' ') as b,
          nvl(to_char(c),' ') as c, nvl(to_char(d),' ') as d, 
          nvl(to_char(e),' ') as e, nvl(to_char(f),' ') as f, 
          nvl(to_char(g),' ') as g, nvl(to_char(h),' ') as h, 
          nvl(to_char(i),' ') as i
    from t
  )  
  unpivot 
  ( val for col in (d,e,f,g,h,i) )
  order by col

演示

更新 2:根据您的新情况,查询可以重新排列为:

with t as
(
select e.empno, e.ename, e.job, e.mgr, e.hiredate, e.sal , 
       d.deptno, d.dname, d.loc 
  from emp e 
  join dept d
    on e.deptno = d.deptno 
)
select empno,ename,job, lower(col) as col, val 
  from
  (
   select to_char(empno) as empno, 
          ename, 
          job, to_char(mgr) as mgr, 
          to_char(hiredate,'yyyy-mm-dd') as hiredate, 
          to_char(sal,'fm999G990D00','NLS_NUMERIC_CHARACTERS = ''.,''') as sal,
          to_char(deptno) as deptno, dname, loc 
     from t
   )  
unpivot include nulls
( val for col in (mgr,hiredate,sal,deptno,dname,loc) );

演示2

只是为了不同的东西,这也可以“老式的方式”完成(即,没有UNPIVOT )。

在这种方法中,将复杂查询交叉连接到行生成器( SELECT rownum FROM DUAL CONNECT BY rownum <= ... )。 然后从生成器对 rownum 进行DECODE 像这样:

select your_complex_query.empno, your_complex_query.ename, your_complex_query.job, 
       DECODE(rn, 1, 'mgr',
                  2, 'hiredate',
                  3, 'sal',
                  4, 'deptno',
                  5, 'dname',
                  6, 'loc',
                  '*error: unmapped*') row_description,
       DECODE(rn, 1, to_char(your_complex_query.mgr),
                  2, to_char(your_complex_query.hiredate, 'DD-MON-YYYY'),
                  3, to_char(your_complex_query.sal, 'FM999,990.00'),
                  4, to_char(your_complex_query.deptno),
                  5, your_complex_query.dname,
                  6, your_complex_query.loc,
                  '*error: unmapped*') row_value
from ( select emp.empno, emp.ename, emp.job, emp.mgr, emp.hiredate, emp.sal , dept.deptno, dept.dname, dept.loc from scott.emp, scott.dept where emp.deptno = dept.deptno) your_complex_query, 
     ( SELECT rownum rn FROM dual CONNECT BY rownum <= 6 ) rn
;

希望您的复杂查询的位置很清楚。

结果:

 +-------+-------+-----------+-----------------+------------+ | EMPNO | ENAME | JOB | ROW_DESCRIPTION | ROW_VALUE | +-------+-------+-----------+-----------------+------------+ | 7839 | KING | PRESIDENT | mgr | - | | 7839 | KING | PRESIDENT | hiredate | 17-Nov-81 | | 7839 | KING | PRESIDENT | sal | 5,000.00 | | 7839 | KING | PRESIDENT | deptno | 10 | | 7839 | KING | PRESIDENT | dname | ACCOUNTING | | 7839 | KING | PRESIDENT | loc | NEW YORK | | 7698 | BLAKE | MANAGER | mgr | 7839 | | 7698 | BLAKE | MANAGER | hiredate | 1-May-81 | | 7698 | BLAKE | MANAGER | sal | 2,850.00 | | 7698 | BLAKE | MANAGER | deptno | 30 | | 7698 | BLAKE | MANAGER | dname | SALES | | 7698 | BLAKE | MANAGER | loc | CHICAGO | | 7782 | CLARK | MANAGER | mgr | 7839 | | 7782 | CLARK | MANAGER | hiredate | 9-Jun-81 | | 7782 | CLARK | MANAGER | sal | 2,450.00 | | 7782 | CLARK | MANAGER | deptno | 10 | | 7782 | CLARK | MANAGER | dname | ACCOUNTING | | 7782 | CLARK | MANAGER | loc | NEW YORK | | 7566 | JONES | MANAGER | mgr | 7839 | | 7566 | JONES | MANAGER | hiredate | 2-Apr-81 | | 7566 | JONES | MANAGER | sal | 2,975.00 | | 7566 | JONES | MANAGER | deptno | 20 | | 7566 | JONES | MANAGER | dname | RESEARCH | | 7566 | JONES | MANAGER | loc | DALLAS | | 7788 | SCOTT | ANALYST | mgr | 7566 | | 7788 | SCOTT | ANALYST | hiredate | 19-Apr-87 | | 7788 | SCOTT | ANALYST | sal | 3,000.00 | | 7788 | SCOTT | ANALYST | deptno | 20 | | 7788 | SCOTT | ANALYST | dname | RESEARCH | | 7788 | SCOTT | ANALYST | loc | DALLAS | | 7902 | FORD | ANALYST | mgr | 7566 | | 7902 | FORD | ANALYST | hiredate | 3-Dec-81 | | 7902 | FORD | ANALYST | sal | 3,000.00 | | 7902 | FORD | ANALYST | deptno | 20 | | 7902 | FORD | ANALYST | dname | RESEARCH | | 7902 | FORD | ANALYST | loc | DALLAS | | 7369 | SMITH | CLERK | mgr | 7902 | | 7369 | SMITH | CLERK | hiredate | 17-Dec-80 | | 7369 | SMITH | CLERK | sal | 800 | | 7369 | SMITH | CLERK | deptno | 20 | | 7369 | SMITH | CLERK | dname | RESEARCH | | 7369 | SMITH | CLERK | loc | DALLAS | | 7499 | ALLEN | SALESMAN | mgr | 7698 | | 7499 | ALLEN | SALESMAN | hiredate | 20-Feb-81 | | 7499 | ALLEN | SALESMAN | sal | 1,600.00 | | 7499 | ALLEN | SALESMAN | deptno | 30 | | 7499 | ALLEN | SALESMAN | dname | SALES | | 7499 | ALLEN | SALESMAN | loc | CHICAGO | | 7521 | WARD | SALESMAN | mgr | 7698 | | 7521 | WARD | SALESMAN | hiredate | 22-Feb-81 | +-------+-------+-----------+-----------------+------------+总统 | +-------+-------+-----------+-----------------+------------+ | EMPNO | ENAME | JOB | ROW_DESCRIPTION | ROW_VALUE | +-------+-------+-----------+-----------------+------------+ | 7839 | KING | PRESIDENT | mgr | - | | 7839 | KING | PRESIDENT | hiredate | 17-Nov-81 | | 7839 | KING | PRESIDENT | sal | 5,000.00 | | 7839 | KING | PRESIDENT | deptno | 10 | | 7839 | KING | PRESIDENT | dname | ACCOUNTING | | 7839 | KING | PRESIDENT | loc | NEW YORK | | 7698 | BLAKE | MANAGER | mgr | 7839 | | 7698 | BLAKE | MANAGER | hiredate | 1-May-81 | | 7698 | BLAKE | MANAGER | sal | 2,850.00 | | 7698 | BLAKE | MANAGER | deptno | 30 | | 7698 | BLAKE | MANAGER | dname | SALES | | 7698 | BLAKE | MANAGER | loc | CHICAGO | | 7782 | CLARK | MANAGER | mgr | 7839 | | 7782 | CLARK | MANAGER | hiredate | 9-Jun-81 | | 7782 | CLARK | MANAGER | sal | 2,450.00 | | 7782 | CLARK | MANAGER | deptno | 10 | | 7782 | CLARK | MANAGER | dname | ACCOUNTING | | 7782 | CLARK | MANAGER | loc | NEW YORK | | 7566 | JONES | MANAGER | mgr | 7839 | | 7566 | JONES | MANAGER | hiredate | 2-Apr-81 | | 7566 | JONES | MANAGER | sal | 2,975.00 | | 7566 | JONES | MANAGER | deptno | 20 | | 7566 | JONES | MANAGER | dname | RESEARCH | | 7566 | JONES | MANAGER | loc | DALLAS | | 7788 | SCOTT | ANALYST | mgr | 7566 | | 7788 | SCOTT | ANALYST | hiredate | 19-Apr-87 | | 7788 | SCOTT | ANALYST | sal | 3,000.00 | | 7788 | SCOTT | ANALYST | deptno | 20 | | 7788 | SCOTT | ANALYST | dname | RESEARCH | | 7788 | SCOTT | ANALYST | loc | DALLAS | | 7902 | FORD | ANALYST | mgr | 7566 | | 7902 | FORD | ANALYST | hiredate | 3-Dec-81 | | 7902 | FORD | ANALYST | sal | 3,000.00 | | 7902 | FORD | ANALYST | deptno | 20 | | 7902 | FORD | ANALYST | dname | RESEARCH | | 7902 | FORD | ANALYST | loc | DALLAS | | 7369 | SMITH | CLERK | mgr | 7902 | | 7369 | SMITH | CLERK | hiredate | 17-Dec-80 | | 7369 | SMITH | CLERK | sal | 800 | | 7369 | SMITH | CLERK | deptno | 20 | | 7369 | SMITH | CLERK | dname | RESEARCH | | 7369 | SMITH | CLERK | loc | DALLAS | | 7499 | ALLEN | SALESMAN | mgr | 7698 | | 7499 | ALLEN | SALESMAN | hiredate | 20-Feb-81 | | 7499 | ALLEN | SALESMAN | sal | 1,600.00 | | 7499 | ALLEN | SALESMAN | deptno | 30 | | 7499 | ALLEN | SALESMAN | dname | SALES | | 7499 | ALLEN | SALESMAN | loc | CHICAGO | | 7521 | WARD | SALESMAN | mgr | 7698 | | 7521 | WARD | SALESMAN | hiredate | 22-Feb-81 | +-------+-------+-----------+-----------------+------------+总统 | +-------+-------+-----------+-----------------+------------+ | EMPNO | ENAME | JOB | ROW_DESCRIPTION | ROW_VALUE | +-------+-------+-----------+-----------------+------------+ | 7839 | KING | PRESIDENT | mgr | - | | 7839 | KING | PRESIDENT | hiredate | 17-Nov-81 | | 7839 | KING | PRESIDENT | sal | 5,000.00 | | 7839 | KING | PRESIDENT | deptno | 10 | | 7839 | KING | PRESIDENT | dname | ACCOUNTING | | 7839 | KING | PRESIDENT | loc | NEW YORK | | 7698 | BLAKE | MANAGER | mgr | 7839 | | 7698 | BLAKE | MANAGER | hiredate | 1-May-81 | | 7698 | BLAKE | MANAGER | sal | 2,850.00 | | 7698 | BLAKE | MANAGER | deptno | 30 | | 7698 | BLAKE | MANAGER | dname | SALES | | 7698 | BLAKE | MANAGER | loc | CHICAGO | | 7782 | CLARK | MANAGER | mgr | 7839 | | 7782 | CLARK | MANAGER | hiredate | 9-Jun-81 | | 7782 | CLARK | MANAGER | sal | 2,450.00 | | 7782 | CLARK | MANAGER | deptno | 10 | | 7782 | CLARK | MANAGER | dname | ACCOUNTING | | 7782 | CLARK | MANAGER | loc | NEW YORK | | 7566 | JONES | MANAGER | mgr | 7839 | | 7566 | JONES | MANAGER | hiredate | 2-Apr-81 | | 7566 | JONES | MANAGER | sal | 2,975.00 | | 7566 | JONES | MANAGER | deptno | 20 | | 7566 | JONES | MANAGER | dname | RESEARCH | | 7566 | JONES | MANAGER | loc | DALLAS | | 7788 | SCOTT | ANALYST | mgr | 7566 | | 7788 | SCOTT | ANALYST | hiredate | 19-Apr-87 | | 7788 | SCOTT | ANALYST | sal | 3,000.00 | | 7788 | SCOTT | ANALYST | deptno | 20 | | 7788 | SCOTT | ANALYST | dname | RESEARCH | | 7788 | SCOTT | ANALYST | loc | DALLAS | | 7902 | FORD | ANALYST | mgr | 7566 | | 7902 | FORD | ANALYST | hiredate | 3-Dec-81 | | 7902 | FORD | ANALYST | sal | 3,000.00 | | 7902 | FORD | ANALYST | deptno | 20 | | 7902 | FORD | ANALYST | dname | RESEARCH | | 7902 | FORD | ANALYST | loc | DALLAS | | 7369 | SMITH | CLERK | mgr | 7902 | | 7369 | SMITH | CLERK | hiredate | 17-Dec-80 | | 7369 | SMITH | CLERK | sal | 800 | | 7369 | SMITH | CLERK | deptno | 20 | | 7369 | SMITH | CLERK | dname | RESEARCH | | 7369 | SMITH | CLERK | loc | DALLAS | | 7499 | ALLEN | SALESMAN | mgr | 7698 | | 7499 | ALLEN | SALESMAN | hiredate | 20-Feb-81 | | 7499 | ALLEN | SALESMAN | sal | 1,600.00 | | 7499 | ALLEN | SALESMAN | deptno | 30 | | 7499 | ALLEN | SALESMAN | dname | SALES | | 7499 | ALLEN | SALESMAN | loc | CHICAGO | | 7521 | WARD | SALESMAN | mgr | 7698 | | 7521 | WARD | SALESMAN | hiredate | 22-Feb-81 | +-------+-------+-----------+-----------------+------------+总统 | +-------+-------+-----------+-----------------+------------+ | EMPNO | ENAME | JOB | ROW_DESCRIPTION | ROW_VALUE | +-------+-------+-----------+-----------------+------------+ | 7839 | KING | PRESIDENT | mgr | - | | 7839 | KING | PRESIDENT | hiredate | 17-Nov-81 | | 7839 | KING | PRESIDENT | sal | 5,000.00 | | 7839 | KING | PRESIDENT | deptno | 10 | | 7839 | KING | PRESIDENT | dname | ACCOUNTING | | 7839 | KING | PRESIDENT | loc | NEW YORK | | 7698 | BLAKE | MANAGER | mgr | 7839 | | 7698 | BLAKE | MANAGER | hiredate | 1-May-81 | | 7698 | BLAKE | MANAGER | sal | 2,850.00 | | 7698 | BLAKE | MANAGER | deptno | 30 | | 7698 | BLAKE | MANAGER | dname | SALES | | 7698 | BLAKE | MANAGER | loc | CHICAGO | | 7782 | CLARK | MANAGER | mgr | 7839 | | 7782 | CLARK | MANAGER | hiredate | 9-Jun-81 | | 7782 | CLARK | MANAGER | sal | 2,450.00 | | 7782 | CLARK | MANAGER | deptno | 10 | | 7782 | CLARK | MANAGER | dname | ACCOUNTING | | 7782 | CLARK | MANAGER | loc | NEW YORK | | 7566 | JONES | MANAGER | mgr | 7839 | | 7566 | JONES | MANAGER | hiredate | 2-Apr-81 | | 7566 | JONES | MANAGER | sal | 2,975.00 | | 7566 | JONES | MANAGER | deptno | 20 | | 7566 | JONES | MANAGER | dname | RESEARCH | | 7566 | JONES | MANAGER | loc | DALLAS | | 7788 | SCOTT | ANALYST | mgr | 7566 | | 7788 | SCOTT | ANALYST | hiredate | 19-Apr-87 | | 7788 | SCOTT | ANALYST | sal | 3,000.00 | | 7788 | SCOTT | ANALYST | deptno | 20 | | 7788 | SCOTT | ANALYST | dname | RESEARCH | | 7788 | SCOTT | ANALYST | loc | DALLAS | | 7902 | FORD | ANALYST | mgr | 7566 | | 7902 | FORD | ANALYST | hiredate | 3-Dec-81 | | 7902 | FORD | ANALYST | sal | 3,000.00 | | 7902 | FORD | ANALYST | deptno | 20 | | 7902 | FORD | ANALYST | dname | RESEARCH | | 7902 | FORD | ANALYST | loc | DALLAS | | 7369 | SMITH | CLERK | mgr | 7902 | | 7369 | SMITH | CLERK | hiredate | 17-Dec-80 | | 7369 | SMITH | CLERK | sal | 800 | | 7369 | SMITH | CLERK | deptno | 20 | | 7369 | SMITH | CLERK | dname | RESEARCH | | 7369 | SMITH | CLERK | loc | DALLAS | | 7499 | ALLEN | SALESMAN | mgr | 7698 | | 7499 | ALLEN | SALESMAN | hiredate | 20-Feb-81 | | 7499 | ALLEN | SALESMAN | sal | 1,600.00 | | 7499 | ALLEN | SALESMAN | deptno | 30 | | 7499 | ALLEN | SALESMAN | dname | SALES | | 7499 | ALLEN | SALESMAN | loc | CHICAGO | | 7521 | WARD | SALESMAN | mgr | 7698 | | 7521 | WARD | SALESMAN | hiredate | 22-Feb-81 | +-------+-------+-----------+-----------------+------------+总统 | +-------+-------+-----------+-----------------+------------+ | EMPNO | ENAME | JOB | ROW_DESCRIPTION | ROW_VALUE | +-------+-------+-----------+-----------------+------------+ | 7839 | KING | PRESIDENT | mgr | - | | 7839 | KING | PRESIDENT | hiredate | 17-Nov-81 | | 7839 | KING | PRESIDENT | sal | 5,000.00 | | 7839 | KING | PRESIDENT | deptno | 10 | | 7839 | KING | PRESIDENT | dname | ACCOUNTING | | 7839 | KING | PRESIDENT | loc | NEW YORK | | 7698 | BLAKE | MANAGER | mgr | 7839 | | 7698 | BLAKE | MANAGER | hiredate | 1-May-81 | | 7698 | BLAKE | MANAGER | sal | 2,850.00 | | 7698 | BLAKE | MANAGER | deptno | 30 | | 7698 | BLAKE | MANAGER | dname | SALES | | 7698 | BLAKE | MANAGER | loc | CHICAGO | | 7782 | CLARK | MANAGER | mgr | 7839 | | 7782 | CLARK | MANAGER | hiredate | 9-Jun-81 | | 7782 | CLARK | MANAGER | sal | 2,450.00 | | 7782 | CLARK | MANAGER | deptno | 10 | | 7782 | CLARK | MANAGER | dname | ACCOUNTING | | 7782 | CLARK | MANAGER | loc | NEW YORK | | 7566 | JONES | MANAGER | mgr | 7839 | | 7566 | JONES | MANAGER | hiredate | 2-Apr-81 | | 7566 | JONES | MANAGER | sal | 2,975.00 | | 7566 | JONES | MANAGER | deptno | 20 | | 7566 | JONES | MANAGER | dname | RESEARCH | | 7566 | JONES | MANAGER | loc | DALLAS | | 7788 | SCOTT | ANALYST | mgr | 7566 | | 7788 | SCOTT | ANALYST | hiredate | 19-Apr-87 | | 7788 | SCOTT | ANALYST | sal | 3,000.00 | | 7788 | SCOTT | ANALYST | deptno | 20 | | 7788 | SCOTT | ANALYST | dname | RESEARCH | | 7788 | SCOTT | ANALYST | loc | DALLAS | | 7902 | FORD | ANALYST | mgr | 7566 | | 7902 | FORD | ANALYST | hiredate | 3-Dec-81 | | 7902 | FORD | ANALYST | sal | 3,000.00 | | 7902 | FORD | ANALYST | deptno | 20 | | 7902 | FORD | ANALYST | dname | RESEARCH | | 7902 | FORD | ANALYST | loc | DALLAS | | 7369 | SMITH | CLERK | mgr | 7902 | | 7369 | SMITH | CLERK | hiredate | 17-Dec-80 | | 7369 | SMITH | CLERK | sal | 800 | | 7369 | SMITH | CLERK | deptno | 20 | | 7369 | SMITH | CLERK | dname | RESEARCH | | 7369 | SMITH | CLERK | loc | DALLAS | | 7499 | ALLEN | SALESMAN | mgr | 7698 | | 7499 | ALLEN | SALESMAN | hiredate | 20-Feb-81 | | 7499 | ALLEN | SALESMAN | sal | 1,600.00 | | 7499 | ALLEN | SALESMAN | deptno | 30 | | 7499 | ALLEN | SALESMAN | dname | SALES | | 7499 | ALLEN | SALESMAN | loc | CHICAGO | | 7521 | WARD | SALESMAN | mgr | 7698 | | 7521 | WARD | SALESMAN | hiredate | 22-Feb-81 | +-------+-------+-----------+-----------------+------------+总统 | +-------+-------+-----------+-----------------+------------+ | EMPNO | ENAME | JOB | ROW_DESCRIPTION | ROW_VALUE | +-------+-------+-----------+-----------------+------------+ | 7839 | KING | PRESIDENT | mgr | - | | 7839 | KING | PRESIDENT | hiredate | 17-Nov-81 | | 7839 | KING | PRESIDENT | sal | 5,000.00 | | 7839 | KING | PRESIDENT | deptno | 10 | | 7839 | KING | PRESIDENT | dname | ACCOUNTING | | 7839 | KING | PRESIDENT | loc | NEW YORK | | 7698 | BLAKE | MANAGER | mgr | 7839 | | 7698 | BLAKE | MANAGER | hiredate | 1-May-81 | | 7698 | BLAKE | MANAGER | sal | 2,850.00 | | 7698 | BLAKE | MANAGER | deptno | 30 | | 7698 | BLAKE | MANAGER | dname | SALES | | 7698 | BLAKE | MANAGER | loc | CHICAGO | | 7782 | CLARK | MANAGER | mgr | 7839 | | 7782 | CLARK | MANAGER | hiredate | 9-Jun-81 | | 7782 | CLARK | MANAGER | sal | 2,450.00 | | 7782 | CLARK | MANAGER | deptno | 10 | | 7782 | CLARK | MANAGER | dname | ACCOUNTING | | 7782 | CLARK | MANAGER | loc | NEW YORK | | 7566 | JONES | MANAGER | mgr | 7839 | | 7566 | JONES | MANAGER | hiredate | 2-Apr-81 | | 7566 | JONES | MANAGER | sal | 2,975.00 | | 7566 | JONES | MANAGER | deptno | 20 | | 7566 | JONES | MANAGER | dname | RESEARCH | | 7566 | JONES | MANAGER | loc | DALLAS | | 7788 | SCOTT | ANALYST | mgr | 7566 | | 7788 | SCOTT | ANALYST | hiredate | 19-Apr-87 | | 7788 | SCOTT | ANALYST | sal | 3,000.00 | | 7788 | SCOTT | ANALYST | deptno | 20 | | 7788 | SCOTT | ANALYST | dname | RESEARCH | | 7788 | SCOTT | ANALYST | loc | DALLAS | | 7902 | FORD | ANALYST | mgr | 7566 | | 7902 | FORD | ANALYST | hiredate | 3-Dec-81 | | 7902 | FORD | ANALYST | sal | 3,000.00 | | 7902 | FORD | ANALYST | deptno | 20 | | 7902 | FORD | ANALYST | dname | RESEARCH | | 7902 | FORD | ANALYST | loc | DALLAS | | 7369 | SMITH | CLERK | mgr | 7902 | | 7369 | SMITH | CLERK | hiredate | 17-Dec-80 | | 7369 | SMITH | CLERK | sal | 800 | | 7369 | SMITH | CLERK | deptno | 20 | | 7369 | SMITH | CLERK | dname | RESEARCH | | 7369 | SMITH | CLERK | loc | DALLAS | | 7499 | ALLEN | SALESMAN | mgr | 7698 | | 7499 | ALLEN | SALESMAN | hiredate | 20-Feb-81 | | 7499 | ALLEN | SALESMAN | sal | 1,600.00 | | 7499 | ALLEN | SALESMAN | deptno | 30 | | 7499 | ALLEN | SALESMAN | dname | SALES | | 7499 | ALLEN | SALESMAN | loc | CHICAGO | | 7521 | WARD | SALESMAN | mgr | 7698 | | 7521 | WARD | SALESMAN | hiredate | 22-Feb-81 | +-------+-------+-----------+-----------------+------------+总统 | +-------+-------+-----------+-----------------+------------+ | EMPNO | ENAME | JOB | ROW_DESCRIPTION | ROW_VALUE | +-------+-------+-----------+-----------------+------------+ | 7839 | KING | PRESIDENT | mgr | - | | 7839 | KING | PRESIDENT | hiredate | 17-Nov-81 | | 7839 | KING | PRESIDENT | sal | 5,000.00 | | 7839 | KING | PRESIDENT | deptno | 10 | | 7839 | KING | PRESIDENT | dname | ACCOUNTING | | 7839 | KING | PRESIDENT | loc | NEW YORK | | 7698 | BLAKE | MANAGER | mgr | 7839 | | 7698 | BLAKE | MANAGER | hiredate | 1-May-81 | | 7698 | BLAKE | MANAGER | sal | 2,850.00 | | 7698 | BLAKE | MANAGER | deptno | 30 | | 7698 | BLAKE | MANAGER | dname | SALES | | 7698 | BLAKE | MANAGER | loc | CHICAGO | | 7782 | CLARK | MANAGER | mgr | 7839 | | 7782 | CLARK | MANAGER | hiredate | 9-Jun-81 | | 7782 | CLARK | MANAGER | sal | 2,450.00 | | 7782 | CLARK | MANAGER | deptno | 10 | | 7782 | CLARK | MANAGER | dname | ACCOUNTING | | 7782 | CLARK | MANAGER | loc | NEW YORK | | 7566 | JONES | MANAGER | mgr | 7839 | | 7566 | JONES | MANAGER | hiredate | 2-Apr-81 | | 7566 | JONES | MANAGER | sal | 2,975.00 | | 7566 | JONES | MANAGER | deptno | 20 | | 7566 | JONES | MANAGER | dname | RESEARCH | | 7566 | JONES | MANAGER | loc | DALLAS | | 7788 | SCOTT | ANALYST | mgr | 7566 | | 7788 | SCOTT | ANALYST | hiredate | 19-Apr-87 | | 7788 | SCOTT | ANALYST | sal | 3,000.00 | | 7788 | SCOTT | ANALYST | deptno | 20 | | 7788 | SCOTT | ANALYST | dname | RESEARCH | | 7788 | SCOTT | ANALYST | loc | DALLAS | | 7902 | FORD | ANALYST | mgr | 7566 | | 7902 | FORD | ANALYST | hiredate | 3-Dec-81 | | 7902 | FORD | ANALYST | sal | 3,000.00 | | 7902 | FORD | ANALYST | deptno | 20 | | 7902 | FORD | ANALYST | dname | RESEARCH | | 7902 | FORD | ANALYST | loc | DALLAS | | 7369 | SMITH | CLERK | mgr | 7902 | | 7369 | SMITH | CLERK | hiredate | 17-Dec-80 | | 7369 | SMITH | CLERK | sal | 800 | | 7369 | SMITH | CLERK | deptno | 20 | | 7369 | SMITH | CLERK | dname | RESEARCH | | 7369 | SMITH | CLERK | loc | DALLAS | | 7499 | ALLEN | SALESMAN | mgr | 7698 | | 7499 | ALLEN | SALESMAN | hiredate | 20-Feb-81 | | 7499 | ALLEN | SALESMAN | sal | 1,600.00 | | 7499 | ALLEN | SALESMAN | deptno | 30 | | 7499 | ALLEN | SALESMAN | dname | SALES | | 7499 | ALLEN | SALESMAN | loc | CHICAGO | | 7521 | WARD | SALESMAN | mgr | 7698 | | 7521 | WARD | SALESMAN | hiredate | 22-Feb-81 | +-------+-------+-----------+-----------------+------------+

如果必须实现结果,最简单的方法是使用INSERT ALL

INSERT ALL
INTO t(empno, ename, job, "key", "value") VALUES (empno, ename, job, 'mgr', mgr)
INTO t(empno, ename, job, "key", "value") VALUES (empno, ename, job, 'hiredate', hiredate)
INTO t(empno, ename, job, "key", "value") VALUES (empno, ename, job, 'sal', sal)
INTO t(empno, ename, job, "key", "value") VALUES (empno, ename, job, 'deptno', deptno)
INTO t(empno, ename, job, "key", "value") VALUES (empno, ename, job, 'dname', dname)
INTO t(empno, ename, job, "key", "value") VALUES (empno, ename, job, 'loc', loc)
select emp.empno, emp.ename, emp.job, emp.mgr, emp.hiredate, emp.sal
      ,dept.deptno, dept.dname, dept.loc 
from emp
join dept 
 on emp.deptno = dept.deptno;

SELECT * FROM t;

db<>小提琴演示

关于 UPDATE2,这似乎确实返回了所需的输出:

with o as (select emp.empno, emp.ename, emp.job, emp.mgr, emp.hiredate, emp.sal , dept.deptno, dept.dname, dept.loc from emp, dept where emp.deptno = dept.deptno)
select o.empno, o.ename, o.job, j.column_name, j.value FROM o inner join (
 select o.empno, 'MGR'  as column_name, TO_CHAR(o.mgr)  as value  FROM o UNION ALL
 select o.empno, 'HIREDATE', TO_CHAR(o.hiredate) FROM o UNION ALL
 select o.empno, 'SAL', TO_CHAR(o.sal) FROM o UNION ALL
 select o.empno, 'DEPTNO', TO_CHAR(o.deptno) FROM o UNION ALL
 select o.empno, 'DNAME', TO_CHAR(o.dname) FROM o UNION ALL
 select o.empno, 'LOC', TO_CHAR(o.loc) FROM o) j
 on (o.empno = j.empno)
 order by o.empno;

但是,您不能使用动态编号。 列和所有“值”必须可转换为字符串。 我不确定在没有动态 SQL 的情况下您是否可以更进一步。

以及 xquery 的阴暗面;)

with big_query as (select 7698 empno, 'BLAKE' ename, 'MANAGER' job, 7839 mgr, to_date('1981-05-01','yyyy-mm-dd') hiredate, 2850.00 sal , 30 deptno, 'SALES' dname, 'CHICAGO' loc from dual
union all
select 7698 empno, 'BLAKE2' ename, 'MANAGER2' job, 7839 mgr, to_date('1981-05-01','yyyy-mm-dd') hiredate, 2850.00 sal , 30 deptno, 'SALES2' dname, 'CHICAGO2' loc from dual 
),
xmlwrap as (select xmlforest(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO,DNAME,LOC) xml_body from big_query)

select x.* from xmlwrap,xmltable('for $i in (4 to 9) 
                                return(
                                <ROW>
                                    <C1>{$doc/*[1]/text()}</C1>
                                    <C2>{$doc/*[2]/text()}</C2>
                                    <C3>{$doc/*[3]/text()}</C3>
                                    <C4>{concat("Name for ", $doc/*[$i]/name())}</C4>
                                    <C5>{$doc/*[$i]/text()}</C5>                                       
                                </ROW>                                                   
                                ) 
                                    ' 
                            passing xml_body as "doc"                   
                            COLUMNS 
                             "C1" varchar2(100) PATH '/ROW/C1',
                             "C2" varchar2(100) PATH '/ROW/C2',
                             "C3" varchar2(100) PATH '/ROW/C3',
                             "C4" varchar2(100) PATH '/ROW/C4',
                             "C5" varchar2(100) PATH '/ROW/C5'
                            ) x;

xmlforest - 将您的列按正确顺序放在这里并更改 big_query。

这对我的员工和部门 hr 表有用 但首先,所有列都需要在 with 子句中转换为 char。

这是我的 SQL

with a as (select emp.employee_id, emp.first_name, emp.job_id, to_char(emp.MANAGER_ID) as MANAGER_ID, 
to_char(emp.HIRE_DATE,'YYYYMMDD') as HIRE_DATE, to_char(emp.salary) as salary, 
to_char(dept.department_id) as department_id , 
to_char(dept.department_name) as department_name ,
to_char(dept.location_id) as location_id 
from HR.employees emp, HR.departments dept where emp.department_id = dept.department_id)
select * from a 
unpivot 
(Value for Detail in ( MANAGER_ID as 'MANAGER_ID',
HIRE_DATE as 'HIRE_DATE',salary as 'SALARY', 
department_id as 'department_id',
department_name as 'department_name',
location_id as 'location_id'));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM