Mon problème est sur Oracle, mais est probablement indépendant de la base de données (?).Comment éviter l'union par jointure?
Je les tableaux suivants:
aa
vid cb
--- --
1 10
2 15
bb
vid cb
--- --
3 25
4 24
** représentant *
repid vid p
----- --- --
99 1 aa
99 2 aa
99 3 bb
99 4 bb
La colonne p indique dans quelle table obtenir la ligne. En réalité, aa et bb sont beaucoup plus différents, et p ne correspond pas au nom de la table, mais donne un moyen d'y arriver. L'exemple est juste une simplification où j'ai un problème. Notez qu'en réalité, il y a plus de 2 tables aa et bb (il y en a 6). Je veux une requête qui retourne ceci:
repid vid p cb
----- --- -- --
99 1 aa 10
99 2 aa 15
99 3 bb 25
99 4 bb 24
Les travaux suivants: (a)
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
Mais je voudrais utiliser la requête dans une vue, sur laquelle il peut y avoir un prédicat poussant.
Donc la question 1 est: est-ce que ce qui suit permet de pousser les prédicats. Question 2: (même si oui pour la question 1) existe-t-il un moyen de le faire sans union, mais avec des jointures. Question 3: Ou tout simplement, une meilleure façon?
script pour créer les données:
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;
Avez-vous le contrôle du schéma? Je suppose que vous ne pouvez pas changer l'une des tables? – Burt
Correct: les tables existent déjà, et je ne peux pas les changer. –