【发布时间】:2009-12-15 23:44:14
【问题描述】:
我的问题出在 Oracle 上,但可能与数据库无关 (?)。
我有以下表格:
aa
vid cb
--- --
1 10
2 15
bb
vid cb
--- --
3 25
4 24
**代表*
repid vid p
----- --- --
99 1 aa
99 2 aa
99 3 bb
99 4 bb
列 p 表示在哪个表中获取该行。 实际上,aa 和 bb 的区别要大得多,并且 p 与表名不匹配,但提供了一种到达那里的方法。这个例子只是我遇到问题的一个简单的例子。 请注意,实际上,有超过 2 个表 aa 和 bb(有 6 个)。 我想要一个返回这个的查询:
repid vid p cb
----- --- -- --
99 1 aa 10
99 2 aa 15
99 3 bb 25
99 4 bb 24
以下作品: (一)
select rep.vid, rep.p, cb
from (
select 'aa' as p,vid,cb from aa
union all
select 'bb' as p, vid,cb from bb) u,rep
where rep.p=u.p and rep.vid=u.vid
(b)
select rep.vid, rep.p,
decode(rep.p, 'aa', (select cb from aa where vid=rep.vid),
'bb', (select cb from bb where vid=rep.vid)) cb
from rep
但我想在视图中使用查询,在该视图上可以进行谓词推送。
所以问题 1 是:以下是否允许谓词推送。 问题 2:(即使问题 1 的答案是肯定的)有没有办法在没有联合但有连接的情况下做到这一点。 问题 3:或者只是一个更好的方法?
创建数据的脚本:
create table bb (vid number(1), cb number(2));
create table aa (vid number(1), cb number(2));
create table rep(rid number(2), vid number(1), p varchar2(2));
insert into rep (rid,vid,p) values (99, 4,'bb');
insert into rep (rid,vid,p) values (99, 3,'bb');
insert into rep (rid,vid,p) values (99, 2,'aa');
insert into rep (rid,vid,p) values (99, 1,'aa');
insert into bb (vid,cb) values (4,24);
insert into bb (vid,cb) values (3,25);
insert into aa (vid,cb) values (2,15);
insert into aa (vid,cb) values (1,10);
commit;
【问题讨论】:
-
您可以控制架构吗?我假设您不能更改任何表格?
-
正确:表格已经存在,我无法更改它们。
标签: sql join union push predicate