Oracle 中没有“选项”可以执行此操作;你may能够找到允许您这样做的客户,因为这是通常在客户中完成的工作;我不知道有一个。
扩展tbone 的回答 https://stackoverflow.com/a/12230772/458741你必须动态地执行此操作。这does not意味着您必须列出每一列。你会使用数据字典 http://docs.oracle.com/cd/E11882_01/server.112/e25789/datadict.htm#CNCPT2140, 具体来说所有选项卡列 http://docs.oracle.com/cd/E11882_01/server.112/e25513/statviews_2103.htm#REFRN20277 or user_tab_columns
创建您的查询。创建具有您想要的确切定义的视图会更容易,以便您可以根据需要重复使用它。
目的是利用列存在作为字符串存储在表中的事实,以便创建查询来使用该列。由于列名和表名存储为字符串,因此您可以使用字符串聚合技术轻松创建查询或 DDL 语句,然后可以手动或动态执行它们。
如果您使用的是 Oracle 11g 第 2 版listagg http://docs.oracle.com/cd/E11882_01/server.112/e25554/analysis.htm#DWHSG8702功能可帮助您:
select 'create or replace view my_view as
select '
|| listagg( table_name || '.' || column_name
|| ' as '
|| substr(table_name,1,1) || '_'
|| column_name, ', ')
within group
( order by case when table_name = 'FOO' then 0 else 1 end
, column_id
)
|| ' from foo f
join bar b
on f.id = b.foo_id'
from user_tab_columns
where table_name in ('FOO','BAR')
;
假设这个表结构:
create table foo ( id number, a number, b number, c number);
create table bar ( foo_id number, a number, b number, c number);
这个单一查询产生以下结果:
create or replace view my_view as
select FOO.ID as F_ID, FOO.A as F_A, FOO.B as F_B, FOO.C as F_C
, BAR.FOO_ID as B_FOO_ID, BAR.A as B_A, BAR.B as B_B, BAR.C as B_C
from foo f
join bar b on f.id = b.foo_id
这是一个SQL小提琴 http://www.sqlfiddle.com/#!4/362b3/3来证明这一点。
如果您不使用 11.2,则可以使用未记录的函数获得完全相同的结果wm_concat http://psoug.org/definition/WM_CONCAT.htm或用户定义的函数stragg http://www.oracle.com/splash/collabsuite/maintenance/index.html,由汤姆·凯特创建。 Oracle Base 有一篇文章关于字符串聚合技术 http://www.oracle-base.com/articles/misc/string-aggregation-techniques.phpStack Overflow 上有很多帖子。
作为一个小附录,您实际上可以通过对上述查询进行少量更改来创建您正在寻找的内容。您可以使用带引号的标识符 http://docs.oracle.com/cd/E11882_01/server.112/e10592/sql_elements008.htm在中创建一个列TABLE_NAME.COLUMN_NAME
格式。你have将其引用为.
不是 Oracle 中对象名称的有效字符。这样做的好处是你得到的正是你想要的。缺点是,如果不使用,查询创建的视图会非常痛苦select * from ...
;选择命名列将require他们被引用。
select 'create or replace view my_view as
select '
|| listagg( table_name || '.' || column_name
|| ' as '
|| '"' || table_name || '.'
|| column_name || '"', ', ')
within group
( order by case when table_name = 'FOO' then 0 else 1 end
, column_id
)
|| ' from foo f
join bar b
on f.id = b.foo_id'
from user_tab_columns
where table_name in ('FOO','BAR')
;
该查询返回 http://www.sqlfiddle.com/#!4/362b3/5:
create or replace view my_view as
select FOO.ID as "FOO.ID", FOO.A as "FOO.A", FOO.B as "FOO.B", FOO.C as "FOO.C"
, BAR.FOO_ID as "BAR.FOO_ID", BAR.A as "BAR.A"
, BAR.B as "BAR.B", BAR.C as "BAR.C"
from foo f
join bar b on f.id = b.foo_id