有没有办法像在 PostgreSQL 中那样在 Oracle 中创建内联匿名 table?
Is there a way to create an inline anonymous table in Oracle like in PostgreSQL?
我有一个 postgres 查询,它从字符串值创建一个匿名 table,然后像这样连接它们:
select distinct anon_table.string1,
anon_table.string2,
anon_table.string3,
rt.string4
from real_table rt
right join (values ('asdf', 'asdf', 'asdf'), ('ghjk','ghjk','ghjk')) AS anon_table (string1, string2, string3)
on rt.string1 = anon_table.string1
是否可以在 oracle 数据库中使用 pl/sql 内联执行此操作?我需要能够从一堆具有命名列的值中创建一个内联匿名 table,然后我可以在外部查询中加入这些值。更希望能够以这种方式而不是使用临时 table.
如果您从 DUAL
table 中 SELECT
并为多行使用 UNION ALL
,则可以使用 SQL 来完成:
SELECT DISTINCT
anon_table.string1,
anon_table.string2,
anon_table.string3,
rt.string4
FROM real_table rt
RIGHT OUTER JOIN (
SELECT 'asdf' AS string1, 'asdf' AS string2, 'asdf' AS string3 FROM DUAL
UNION ALL
SELECT 'ghjk','ghjk','ghjk' FROM DUAL
) anon_table
ON rt.string1 = anon_table.string1
或者,使用 sub-query 分解子句:
WITH anon_table (string1, string2, string3) AS (
SELECT 'asdf', 'asdf', 'asdf' FROM DUAL UNION ALL
SELECT 'ghjk','ghjk','ghjk' FROM DUAL
)
SELECT DISTINCT
anon_table.string1,
anon_table.string2,
anon_table.string3,
rt.string4
FROM real_table rt
RIGHT OUTER JOIN anon_table
ON rt.string1 = anon_table.string1
或者您可以在 SQL 范围内声明一个对象和一个集合类型:
CREATE TYPE string_triplet AS OBJECT(
string1 VARCHAR2(20),
string2 VARCHAR2(20),
string3 VARCHAR2(20)
);
CREATE TYPE string_triplet_list AS TABLE OF string_triplet;
然后:
SELECT DISTINCT
anon_table.string1,
anon_table.string2,
anon_table.string3,
rt.string4
FROM real_table rt
RIGHT OUTER JOIN TABLE(
string_triplet_list(
string_triplet('asdf', 'asdf', 'asdf'),
string_triplet('ghjk', 'ghjk', 'ghjk')
)
) anon_table
ON rt.string1 = anon_table.string1
db<>fiddle here
Is it possible to do this inline with pl/sql in an oracle database?
并非没有困难,因为您不能在 SQL 范围内使用 PL/SQL 定义的类型。但是你并不真的需要 PL/SQL 因为你可以在 SQL 中做到这一点,如上面的例子所示。
我有一个 postgres 查询,它从字符串值创建一个匿名 table,然后像这样连接它们:
select distinct anon_table.string1,
anon_table.string2,
anon_table.string3,
rt.string4
from real_table rt
right join (values ('asdf', 'asdf', 'asdf'), ('ghjk','ghjk','ghjk')) AS anon_table (string1, string2, string3)
on rt.string1 = anon_table.string1
是否可以在 oracle 数据库中使用 pl/sql 内联执行此操作?我需要能够从一堆具有命名列的值中创建一个内联匿名 table,然后我可以在外部查询中加入这些值。更希望能够以这种方式而不是使用临时 table.
如果您从 DUAL
table 中 SELECT
并为多行使用 UNION ALL
,则可以使用 SQL 来完成:
SELECT DISTINCT
anon_table.string1,
anon_table.string2,
anon_table.string3,
rt.string4
FROM real_table rt
RIGHT OUTER JOIN (
SELECT 'asdf' AS string1, 'asdf' AS string2, 'asdf' AS string3 FROM DUAL
UNION ALL
SELECT 'ghjk','ghjk','ghjk' FROM DUAL
) anon_table
ON rt.string1 = anon_table.string1
或者,使用 sub-query 分解子句:
WITH anon_table (string1, string2, string3) AS (
SELECT 'asdf', 'asdf', 'asdf' FROM DUAL UNION ALL
SELECT 'ghjk','ghjk','ghjk' FROM DUAL
)
SELECT DISTINCT
anon_table.string1,
anon_table.string2,
anon_table.string3,
rt.string4
FROM real_table rt
RIGHT OUTER JOIN anon_table
ON rt.string1 = anon_table.string1
或者您可以在 SQL 范围内声明一个对象和一个集合类型:
CREATE TYPE string_triplet AS OBJECT(
string1 VARCHAR2(20),
string2 VARCHAR2(20),
string3 VARCHAR2(20)
);
CREATE TYPE string_triplet_list AS TABLE OF string_triplet;
然后:
SELECT DISTINCT
anon_table.string1,
anon_table.string2,
anon_table.string3,
rt.string4
FROM real_table rt
RIGHT OUTER JOIN TABLE(
string_triplet_list(
string_triplet('asdf', 'asdf', 'asdf'),
string_triplet('ghjk', 'ghjk', 'ghjk')
)
) anon_table
ON rt.string1 = anon_table.string1
db<>fiddle here
Is it possible to do this inline with pl/sql in an oracle database?
并非没有困难,因为您不能在 SQL 范围内使用 PL/SQL 定义的类型。但是你并不真的需要 PL/SQL 因为你可以在 SQL 中做到这一点,如上面的例子所示。