Добрый всем вечер!
Хочу спросить у Вас, можно ли для данной задачи построить более оптимальный запрос?
Есть таблица1 и есть таблица2 с такой же структурой.
create table m(id number, val varchar2(1));
create table t(id number, val varchar2(1));
insert into m values(1, 'X');
insert into m values(2, 'X');
insert into m values(3, 'X');
insert into t values(3, 'Y');
insert into t values(4, 'Y');
insert into t values(5, 'Y');
Мне нужно выбрать все поля из таблицы 1, но с одним условием: если PK таблицы1 есть в таблице2, то строка должна быть выбрана из таблицы2 (для данного PK). У меня пока реализовано таким образом:
select s.id, nvl(t.val, m.val) value
from
(select id from m
union
select id from t) s
left join m on s.id= m.id
left join t on s.id= t.id
order by s.id;
drop table m;
drop table t;
ID VALUE
---------- -----
1 X
2 X
3 Y
4 Y
5 Y
Но мне не нравится план выполнения (по 2 full scan на каждую таблицу).
--------------------------------------------------------------------------------
Plan hash value: 2596495759
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 6 | 258 | 16 (25)| 00:00:01 |
| 1 | SORT ORDER BY | | 6 | 258 | 16 (25)| 00:00:01 |
|* 2 | HASH JOIN OUTER | | 6 | 258 | 15 (20)| 00:00:01 |
|* 3 | HASH JOIN OUTER | | 6 | 168 | 12 (25)| 00:00:01 |
| 4 | VIEW | | 6 | 78 | 8 (25)| 00:00:01 |
| 5 | SORT UNIQUE | | 6 | 78 | 8 (63)| 00:00:01 |
| 6 | UNION-ALL | | | | | |
| 7 | TABLE ACCESS FULL| M | 3 | 39 | 3 (0)| 00:00:01 |
| 8 | TABLE ACCESS FULL| T | 3 | 39 | 3 (0)| 00:00:01 |
| 9 | TABLE ACCESS FULL | M | 3 | 45 | 3 (0)| 00:00:01 |
| 10 | TABLE ACCESS FULL | T | 3 | 45 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------------
Заранее спасибо за ответы.