2

我的问题出在 Oracle 上,但可能与数据库无关(?)。

我有以下表格:

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

(二)

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;
4

2 回答 2

2

我不再有 Oracle 实例可供使用,但我确实尝试过使用 PostgreSQL,这可能还是很有趣的?

我对 PostgreSQL 的实验表明,实际上联合工作得更好。我根据您的联合查询创建了一个视图,并且 postgres 能够将诸如“cb BETWEEN 12 AND 27”之类的谓词推送到 aa 和 bb 的扫描中。

相比之下,我创建了一个使用连接的视图:

create view rep2 as
  select rep.vid, p, coalesce(aa.cb, bb.cb) as cb
  from rep
       left join aa on aa.vid = rep.vid and rep.p = 'aa'
       left join bb on bb.vid = rep.vid and rep.p = 'bb'

现在的问题是,coalesce() 阻止了一个涉及 cb 的谓词被推入 aa 和 bb 的扫描中。

于 2009-12-16T00:23:51.223 回答
0

Ajoin可以指定多个条件。表名可以是 1。例如,如果table1有一个名为TableName引用其他表的列,您可以使用:

select      *
from        table1 t1
left join   table2 t2
on          t1.TableName = 'table2'
            and t1.id = t2.id
left join   table3 t3
on          t1.TableName = 'table3'
            and t1.id = t3.id

您可以通过这种方式添加任意数量的表。

至于你的第三个问题,总是有更好的方法。问题是,这样就够了吗?如果不是,您能否定义可接受解决方案的要求?

于 2009-12-15T23:49:19.967 回答