是否有一种方法来创建一个内联匿名表在Oracle像在PostgreSQL?



我有一个postgres查询,从字符串值创建一个匿名表,然后像这样连接它们:

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内联?我需要能够能够创建一个内联匿名表从一堆值与命名列,我可以在外部查询中加入。我更希望能够这样做,而不是使用临时表。

如果您从DUAL表中获取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

或者,使用子查询分解子句:

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<此处小提琴>

是否可以在oracle数据库中与pl/sql内联?

不是没有一些困难,因为你不能在SQL范围内使用PL/SQL定义的类型。但是你真的不需要PL/SQL,因为你可以用上面的例子演示的SQL来做。

最新更新