0

我正在尝试将用 SQL 编写的代码转换为 oracle,并在其中使用外部应用。但是由于某种原因,外部应用在 oracle 中不起作用。我正在使用 oracle 12c。我正在转换的代码是:

select * from FROM table1 S1
OUTER APPLY (VALUES (S1.FM46B_PROV_NET_SPEC_P, '1'),
                    (S1.PROV_NET_SPEC_1,'2'),
                    (S1.PROV_NET_SPEC_2,'3'),
                    (S1.PROV_NET_SPEC_3,'4')) PS(PROV_SPEC, SpecType)

我确实使用左连接和联合在 oracle 中编写了代码,但它不起作用。有人可以告诉我需要做什么才能使用外部应用或使用其他方式编写代码。

提前致谢。

4

2 回答 2

0

使用select from dual

select * 
from table1 S1 outer apply
     (select S1.FM46B_PROV_NET_SPEC_P as prev_spec, '1' as spectype from dual union all
      select S1.PROV_NET_SPEC_1, '2' from dual union all
      select S1.PROV_NET_SPEC_2, '3' from dual union all
      select S1.PROV_NET_SPEC_3, '4' from dual
     ) PS;

我会使用等价物cross join lateral而不是outer apply明确说明连接的类型,但两者都受支持。

无论如何,Oracle 提供了对横向连接的支持,但没有提供对使用values.

于 2020-11-18T12:25:45.753 回答
0

如果您只想UNPIVOT将列转换为行,则:

select *
FROM   table1
UNPIVOT (
  prov_spec FOR spec_type IN (
    FM46B_PROV_NET_SPEC_P AS '1',
    PROV_NET_SPEC_1 AS '2',
    PROV_NET_SPEC_2 AS '3',
    PROV_NET_SPEC_3 AS '4' 
  )
);

其中,对于样本数据:

CREATE TABLE table1 ( id, FM46B_PROV_NET_SPEC_P, PROV_NET_SPEC_1, PROV_NET_SPEC_2, PROV_NET_SPEC_3 ) AS
SELECT 1, '1.spec.p', '1.spec.1', '1.spec.2', '1.spec.3' FROM DUAL UNION ALL
SELECT 2, '2.spec.p', '2.spec.1', '2.spec.2', '2.spec.3' FROM DUAL;

输出:

身份证 | SPEC_TYPE | PROV_SPEC
-: | :-------- | :--------
 1 | 1 | 1.spec.p
 1 | 2 | 1.spec.1
 1 | 3 | 1.spec.2
 1 | 4 | 1.spec.3
 2 | 1 | 2.spec.p
 2 | 2 | 2.spec.1
 2 | 3 | 2.spec.2
 2 | 4 | 2.spec.3

db<>在这里摆弄

于 2020-11-18T13:23:45.673 回答