是否有任何设置或方法可以让Oracle在< table>中返回结果.< column>格式?例如:
查询:
SELECT * FROM foo f INNER JOIN bar b ON b.foo_id = f.id
期望的结果:
F.ID F.BLAH B.ID B.FOO_ID B.BLAH -------------------------------------------------------- 1 blah 7 1 blah 2 blah 8 2 blah 3 blah 9 2 blah
显而易见的解决方案是单独为每个列设置别名SELECT f.id AS F_ID,…;但是,我需要导出一些非常大的遗留表(300列),因此使用此方法会导致查询变得庞大且不切实际.
Oracle中没有“选项”可以做到这一点;您可以找到允许您这样做的客户,因为这是通常在客户端完成的工作;我不知道一个.
原文链接:https://www.f2er.com/oracle/204866.html要在tbone’s answer上扩展,您将不得不动态地执行此操作.这并不意味着您必须列出每一列.您可以使用data dictionary,特别是all_tab_columns或user_tab_columns来创建查询.使用您想要的确切定义创建视图会更容易,以便您可以根据需要重复使用它.
目的是使用列存在作为字符串存储在表中的事实,以便创建使用该列的查询.由于列名和表名存储为字符串,因此您可以使用字符串聚合技术轻松创建可以手动或动态执行的查询或DDL语句.
如果您使用的是Oracle 11g第2版,listagg
功能可以帮助您:
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,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 Fiddle.
如果您没有使用11.2,则可以使用未记录的函数wm_concat
或由Tom Kyte创建的用户定义函数stragg
获得完全相同的结果. Oracle Base在string aggregation techniques上有一篇文章,Stack Overflow上有很多帖子.
作为一个小附录,您可以通过对上述查询进行少量更改来实际创建您正在寻找的内容.您可以使用quoted identifier以TABLE_NAME.COLUMN_NAME格式创建列.你必须引用它.不是Oracle中对象名的有效字符.这样做的好处是你可以获得你想要的东西.缺点是,如果你不使用select * from …,查询创建的视图是一个巨大的痛苦;选择命名列将要求它们被引用.
select 'create or replace view my_view as select ' || listagg( table_name || '.' || column_name || ' as ' || '"' || table_name || '.' || column_name || '"','BAR') ;
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