как не делать лишних запросов во вьюшке?

Vagon
Дата: 18.11.2008 13:07:42
Есть несколько таблиц примерно одинаковой структуры, причем таблицы очень широкие.
Необходимо сделать обьединение этих таблиц в 1-у вьюшку.
Причем вьюшка уже неширокая, т.е. вместо полей типа Стр1, Стр2, .. Стр50 во вьюшке должны быть поле Кепшн со значениями 'Стр1', 'Стр2', .. 'Стр50' и Велью со значениями тех же полей в широких таблицах.
Я предполагаю использовать юньен по каждому полю каждой таблицы. К сожалению это получится очень немало запросов.
Но есть нюанс: как правило, в таблицах заполнены значения не более 1-2 первых полей.
И я бы хотел как-то вставить условие которое бы прекращало обработку любой исходной таблицы, как только дежурный запрос пустой.
Я оч. слабенько знаю Оракл, поэтому не представляю даже возможно ли это.
Можно ли это сделать?
Или есть какой-то более эфективный способ получить желаемое?
Буду оч. благодарен за помощь.
Добрый Э - Эх
Дата: 18.11.2008 13:25:18
Я смотрю, ты не только оракл слабо знаешь, но мысли свои донести до окружабщих не умеешь. Перечитал твоё сообщения пять раз (честно, ровно пять раз). Но так и не понял - чего же ты там пытаешься изобрести...
Может на простецком примере с двумя табличками на пять строк по два-три поля в каждой расскажешь, что тебе нужно?
Добрый Э - Эх
Дата: 18.11.2008 13:27:38
О-о-о-о, после десятого прочтение кажись стало проясняться. Я так понимаю, что ты пытаешься UNPIVOT сделать? И сделать это так, чтобы не читать таблицу столько раз, сколько в ней есть разных полей?
Добрый Э - Эх
Дата: 18.11.2008 13:35:57
Как-то так?
--
-- Тестовые данные:
with 
  t1 as 
    (
      select 1 as "Стр1", 2 as "Стр2", 3 as "Стр3" from dual union all
      select 4 as "Стр1", 5 as "Стр2", 6 as "Стр3" from dual union all
      select 7 as "Стр1", 8 as "Стр2", 9 as "Стр3" from dual 
    ),
  t2 as
    (
      select 10 as "Стр1", 11 as "Стр2", 12 as "Стр3" from dual union all
      select 13 as "Стр1", 14 as "Стр2", 15 as "Стр3" from dual union all
      select 16 as "Стр1", 17 as "Стр2", 18 as "Стр3" from dual 
    )
--
--
-- Основной запрос:
select decode(unpivot.lv,1,'Стр1',2,'Стр2',3,'Стр3') as "Кепшн",
       decode(unpivot.lv,1,"Стр1",2,"Стр2",3,"Стр3") as "Велью"
  from t1, (select level lv from dual connect by level <= 3) unpivot
union all
select decode(unpivot.lv,1,'Стр1',2,'Стр2',3,'Стр3') as "Кепшн",
       decode(unpivot.lv,1,"Стр1",2,"Стр2",3,"Стр3") as "Велью"
  from t2, (select level lv from dual connect by level <= 3) unpivot
Vagon
Дата: 18.11.2008 13:45:49
Добрый Э - Эх,

Спасибо. Что-то похожее. Может быть и то что надо.
Vagon
Дата: 18.11.2008 13:55:39
Добрый Э - Эх,

select v.id,
	   decode(unpivot.lv,
	   					 1,'String1',
						 2,'String2',
						 3,'String3') as Caption,
       decode(unpivot.lv,
	   					 1,String1,
						 2,String2,
						 3,String3) as Value
  from v, (select level lv from dual connect by level <= 3) unpivot

У меня 2 вопроса :-) :

- как сделать что-бы не было пустой Value (там оч. много таких строк),
- что делает:
select level lv from dual connect by level <= 3
(если не трудно..)
Добрый Э - Эх
Дата: 18.11.2008 13:57:41
А, тебе же ещё нужно отсечь пустые значения:
-- Тестовые данные:
with 
  t1 as 
    (
      select null as "Стр1", 2 as "Стр2", 3 as "Стр3" from dual union all
      select 4 as "Стр1", null as "Стр2", 6 as "Стр3" from dual union all
      select 7 as "Стр1", 8 as "Стр2", null as "Стр3" from dual 
    ),
  t2 as
    (
      select 10 as "Стр1", 11 as "Стр2", 15 as "Стр3" from dual union all
      select 13 as "Стр1", null as "Стр2", null as "Стр3" from dual union all
      select 16 as "Стр1", 17 as "Стр2", null as "Стр3" from dual 
    )
--
--
-- Основной запрос:
select 'T1' as "ТэйблНэйм",
       decode(unpivot.lv,1,'Стр1',2,'Стр2',3,'Стр3') as "Кепшн",
       decode(unpivot.lv,1,"Стр1",2,"Стр2",3,"Стр3") as "Велью"
  from t1, (select level lv from dual connect by level <= 3) unpivot
 where t1."Стр1" is not null and unpivot.lv = 1
    or t1."Стр2" is not null and unpivot.lv = 2
    or t1."Стр3" is not null and unpivot.lv = 3
 UNION ALL
select 'T2' as "ТэйблНэйм",
       decode(unpivot.lv,1,'Стр1',2,'Стр2',3,'Стр3') as "Кепшн",
       decode(unpivot.lv,1,"Стр1",2,"Стр2",3,"Стр3") as "Велью"
  from t2, (select level lv from dual connect by level <= 3) unpivot
 where t2."Стр1" is not null and unpivot.lv = 1
    or t2."Стр2" is not null and unpivot.lv = 2
    or t2."Стр3" is not null and unpivot.lv = 3
Добрый Э - Эх
Дата: 18.11.2008 14:02:21
Vagon
У меня 2 вопроса :-) :

- как сделать что-бы не было пустой Value (там оч. много таких строк),
- что делает:
select level lv from dual connect by level <= 3
(если не трудно..)

На первый вопрос смотри мой пост выше...
На второй - генерирует набор данных из трех строк.
В реальном запросе тебе нужно будет сгенерировать столько строк, сколько полей в таблице.
Количество генерируемых строк управляется условием:
select level lv from dual connect by level <= 3
Замена числа "три" на любое другое изменит кол-во генерируемых строк на то, какое число ты поставишь вместо тройки.
Vagon
Дата: 18.11.2008 14:05:42
Добрый Э - Эх,

Большое спасибо за помощь.