我有两个同一个表的模式。例如schema1.adress和schema2.adress。 两个表都是相同的。
表客户的布局: customerno:整数 name:varchar2(50)
现在我想使用类似的东西来获取模式1的客户
“select * from customer where schemaname = 1”或
“select * from customer where schemaname = 2”
Oracle中是否有一种机制可以根据select语句中的条件切换模式?
在你问之前:对于一个新项目,我必须查询遗留模式。我无法更改架构,但我可以在架构/用户上设置任何权限。
有什么想法吗?
感谢您的回复,
斯文
答案 0 :(得分:0)
您可以为您希望他们访问的schema.table创建用户的私有同义词,
create synonym user1.customer for schemaname1.customer;
create synonym user2.customer for schemaname2.customer;
然后,您的查询将始终只是从客户中选择*;
答案 1 :(得分:0)
因此,当您要从schema1.customer中选择并从schema2.customer中选择时,您是以同一用户身份登录吗?
可能的方式可能是:
select *
from (
select 'schema1' schema$name, c.* from schema1.customer c
union all
select 'schema2' schema$name, c.* from schema2.customer c
)
where schema$name = 'schema1'
如果您可以创建视图,则可以创建一个类似以下的视图:
create or replace view customer_view as
select 'schema1' schema$name, c.* from schema1.customer c
union all
select 'schema2' schema$name, c.* from schema2.customer c
这样可以做到:
select *
from customer_view
where schema$name = 'schema1'
无论您是否使用视图,Oracle优化器在大多数情况下都可以推送谓词"其中schema $ name =' schema1'"进入UNION ALL,然后它识别出它根本不需要访问schema2.customer。