2012-05-24 2 views
1

Я пытаюсь сделать подтаблицу, которая «хранит» декодирование между двумя значениями, потому что мне нужно использовать это декодирование несколько раз. Скажем, это мои таблицы:Построение временной таблицы в Oracle SQL

Table Person 
Name Number_name 
Jeremy One 
Thomas Two 
Stephen Three 

мой текущий SQL выглядит следующим образом:

SELECT 
    decode (number_name, 
    'one',1, 
    'two',2, 
    'three',3, 
    'four',4) 
    num 
    FROM person where name = 'Jeremy' 
    and (some other condition) 
UNION SELECT 
    decode (number_name, 
    'one',1, 
    'two',2, 
    'three',3, 
    'four,4) 
    num 
    FROM Person 
    where Name <> "Jeremy" 
    and (some other condition) 

То, что я хотел бы быть в состоянии сделать что-то вроде этого:

SELECT num from my_temp_table where name = "Jeremy" and (some other condition) 
union select num from my_temp_table where name <> "Jeremy" and (some other condition) 
... 

где my_temp_table создается во время этого запроса (он перестает существовать, когда запрос завершается) и будет выглядеть как

Table my_temp_table 
Name num 
One 1 
Two 2 
Three 3 
Four 4 

И надеюсь, я могу сделать это без ПР»„выбрать одно имя, 1 Num от двойного союза все ...“

Является ли это выполнимо?

+0

Как о детерминированной функции? Alessandro – archimede

ответ

5

Предложение WITH звучит как самое близкое к тому, что вы описываете. Но это требует, чтобы вы каким-то образом генерировали данные. Выбор из DUAL, вероятно, самого простого варианта

WITH my_temp_table AS (
    SELECT 'One' name, 1 num from dual union all 
    SELECT 'Two', 2 from dual union all 
    SELECT 'Three', 3 from dual union all 
    SELECT 'Four', 4 from dual 
) 
SELECT * 
    FROM my_temp_table 
     JOIN person ON (<<some join condition>>) 
WHERE <<some predicate>> 

Поскольку вы не хотите, чтобы союз кучи запросов, вы могли бы сделать что-то вроде

WITH my_temp_table AS (
    select level num, 
     initcap(to_char(to_date(level, 'J'), 
          'JSP')) name 
    from dual 
connect by level <= 4 
) 
... 
Смежные вопросы