我可以使用任何设置或方法让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多列),因此使用此方法会导致查询变得庞大且不切实际。
答案 0 :(得分:8)
Oracle中没有“选项”来执行此操作;您可能能够找到允许您这样做的客户端,因为这是通常在客户端完成的工作;我不知道一个。
要扩展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, 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 Fiddle来证明这一点。
如果您没有使用11.2,则可以使用由Tom Kyte创建的未记录的函数wm_concat
或用户定义的函数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 || '"', ', ')
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 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
答案 1 :(得分:3)
使用别名不会使查询变得不切实际,它只是不像键入*那样方便。使用动态SQL为您生成列:
select 'f.' || column_name || ' as F_' || column_name || ','
from all_tab_columns
where table_name = 'FOO'
order by column_id;
对您需要的任何其他宽表执行相同操作,然后复制/粘贴到查询中。另请注意30个字符的限制,希望您的列中没有一个超过28个。