我正在尝试使用“文字”多列表与 Oracle 11g 进行联接查询。
这是我根据这个答案想出的最好的答案( 这个答案建议了一种更好的语法,但据我所知,它仅适用于单列表):
SELECT * from
(
-- The ugly... it burns...
select 'APPLE' as n, 'FRUIT' as m from dual
union all select 'CARROT' as n, 'VEGGIE' as m from dual
union all select 'PEACH' as n, 'FRUIT' as m from dual
union all select 'CUCUMBER' as n, 'VEGGIE' as m from dual
union all select 'ORANGE' as n, 'FRUIT' as m from dual
)
在Oracle中创建多行多列文字表有没有不太难看的方法?不幸的是,我无法创建临时表。
<rant>
正如我所期望的,PostgreSQL 对于文字表有一个漂亮、健全的语法,但 Oracle 却一团糟。</rant>
编辑:我已经尝试了行值构造函数语法,如@Mark Chesney建议的,但这也不起作用:
select n,m from dual where (n,m) in (...)
给了我一个无效标识符错误。
对于两列,您可以使用 ODCIObjectList:
select objectschema m, objectname n
from table(sys.ODCIObjectList(
sys.odciobject('APPLE', 'FRUIT'),
sys.odciobject('CARROT', 'VEGGIE'),
sys.odciobject('PEACH', 'FRUIT'),
sys.odciobject('CUCUMBER', 'VEGGIE'),
sys.odciobject('ORANGE', 'FRUIT')));
M N
---------- ----------
APPLE FRUIT
CARROT VEGGIE
PEACH FRUIT
CUCUMBER VEGGIE
ORANGE FRUIT
对于更多列,您可以定义自己的类型:
create type t as object (a varchar2(10), b varchar2(10), c number);
create type tt as table of t;
select * from table( tt (
t('APPLE', 'FRUIT', 1),
t('APPLE', 'FRUIT', 1122),
t('CARROT', 'VEGGIE', 3),
t('PEACH', 'FRUIT', 104),
t('CUCUMBER', 'VEGGIE', 5),
t('ORANGE', 'FRUIT', 6) ) )
A B C
---------- ---------- ----------
APPLE FRUIT 1
APPLE FRUIT 1122
CARROT VEGGIE 3
PEACH FRUIT 104
CUCUMBER VEGGIE 5
ORANGE FRUIT 6
对于许多专栏,您可以像这样加入
SELECT a.v field1, b.v field2
FROM (SELECT column_value v, rownum r
FROM TABLE(sys.odcivarchar2list('abc', 'def', 'ghi'))) a
JOIN (SELECT column_value v, rownum r
FROM TABLE(sys.odcivarchar2list('abc', 'def', 'ghi'))) b ON a.r = b.r
从 Oracle 23 开始,您可以使用
VALUES
语法:
SELECT *
FROM ( VALUES ('APPLE', 'FRUIT'),
('CARROT', 'VEGGIE'),
('PEACH', 'FRUIT'),
('CUCUMBER', 'VEGGIE'),
('ORANGE', 'FRUIT')
) t (m, n);
输出:
M | N |
---|---|
苹果 | 水果 |
胡萝卜 | 蔬菜 |
桃子 | 水果 |
黄瓜 | 蔬菜 |
橙色 | 水果 |