Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Подскажите запрос для объединения трёх таблиц  [new]
ТриТаблицы
Guest
Есть три таблицы:

create table ORG
(
  id     NUMBER not null,
  name   VARCHAR2(255) not null
);

create table ACT_PATTERN
(
  id     NUMBER not null,
  name   VARCHAR2(255) not null,
  value  VARCHAR2(255)
);

create table ACT
(
  id     NUMBER not null,
  org_id NUMBER not null,
  pattern_id number not null,
  value  VARCHAR2(255)
);


insert into ORG(id, name)
values (1, 'Организация 1');
insert into ORG(id, name)
values (2, 'Организация 2');

insert into ACT_PATTERN (id, name, value) values(3, 'Действие 1', 'значение 1');
insert into ACT_PATTERN (id, name, value) values(4, 'Действие 2', 'значение 2');
insert into ACT_PATTERN (id, name, value) values(5, 'Действие 3', 'значение 3');

insert into ACT(id, org_id, pattern_id, value)
values (6, 1, 3, 'Новое значение');


в ORG хранятся организации, в ACT_PATTERN - шаблоны действий с описанием по-умолчанию,
а в ACT - реальные действия, с изменённым описанием и кодом шаблона, на основе которого создано действие.

Требуется вывести список организаций, объединённый с действиями:
select tor.NAME ORG_NAME, tap.name ACT_NAME, tap.value ACT_VALUE
from ORG tor cross join ACT_PATTERN tap

при этом, если в ACT есть действие для данной организации и данного шаблона,
то надо вывести запись из ACT, иначе - запись из ACT_PATTERN

Т.е. из приведённых таблиц получить следующее:
ORG_NAME         ACT_NAME     ACT_VALUE
--------------  -----------  ----------------
Организация 1   Действие 1    Новое значение
Организация 1   Действие 2    значение 2
Организация 1   Действие 3    значение 3
Организация 2   Действие 1    значение 1
Организация 2   Действие 2    значение 2
Организация 2   Действие 3    значение 3

Можно ли этого добиться одним запросом?
6 июл 11, 17:24    [10934175]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите запрос для объединения трёх таблиц  [new]
Lecter
Member

Откуда: Киев
Сообщений: 2032
ТриТаблицы,

2 x left join + nvl( decode ) или я как просмотрел что то?
6 июл 11, 17:35    [10934285]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите запрос для объединения трёх таблиц  [new]
ТриТаблицы
Guest
Сообразил пока только такое:
select tor.NAME ORG_NAME, tap.name ACT_NAME, NVL(ta.value, tap.value) ACT_VALUE
from ORG tor cross join ACT_PATTERN tap
left join ACT ta on ta.pattern_id = tap.id and ta.org_id = tor.id
order by tor.NAME, tap.name

могут быть более оптимальные варианты?
6 июл 11, 17:47    [10934393]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите запрос для объединения трёх таблиц  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
with org as
(
	select 1 as id, 'Организация 1' as name from dual
	union all select 2, 'Организация 2' from dual
),
act_pattern as
(
	select 3 as id, 'Действие 1' as name, 'значение 1' value from dual
	union all select 4, 'Действие 2', 'значение 2' from dual
	union all select 5, 'Действие 3', 'значение 3' from dual
),
act as
(
	select 6 as id, 1 as org_id, 3 as pattern_id, 'Новое значение' as value from dual
)
select o.name as org_name,
		ap.name as act_name,
		coalesce(
			(select a.value
				from act a
				where a.org_id = o.id
					and a.pattern_id = ap.id),
			ap.value) as act_value
	from org o
		cross join act_pattern ap
Организация 1	Действие 1	Новое значение
Организация 1 Действие 2 значение 2
Организация 1 Действие 3 значение 3
Организация 2 Действие 1 значение 1
Организация 2 Действие 2 значение 2
Организация 2 Действие 3 значение 3
6 июл 11, 17:50    [10934415]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите запрос для объединения трёх таблиц  [new]
ТриТаблицы
Guest
--Eugene--,

Спасибо за вариант, подтолкнуло в нужную сторону. А что в данном случае будет быстрее, NVL или COALESCE? В оригинале у меня больше колонок в ACT и ACT_PATTERN, уменьшил их количество для упрощения описания.
6 июл 11, 18:11    [10934595]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите запрос для объединения трёх таблиц  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
ТриТаблицы,

COALESCE
6 июл 11, 18:17    [10934624]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите запрос для объединения трёх таблиц  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
на самом деле в данном случае не важно, NVL или COALESCE
вот если бы было COALESCE(var1, (select ...)), а не наоборот, тогда была бы небольшая разница
6 июл 11, 18:20    [10934646]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите запрос для объединения трёх таблиц  [new]
ТриТаблицы
Guest
--Eugene--,

Большое спасибо!
6 июл 11, 18:33    [10934704]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить