2011-01-04 3 views
2

Я ищу с изящным способом, чтобы выбрать столбец из таблицы А, где, как имя столбца извлекается из запроса на таблицу В.выбрать столбец, где имя столбца извлекается из запроса

запрос по результатам таблицы B в 'col01' столе несколько столбцов с именем 'col01','col02','col03',...

Окончательной запрос должна быть для результата

 
result from B | effective SQL query 
'col01'  | SELECT col01 FROM A 
'col02'  | SELECT col02 FROM A 

Я ищу чистый SQL решения, без сценариев. Он должен работать с Oracle и/или MySQL.

ответ

7

Я ищу чистое решение SQL без скриптов.

Это невозможно. Вы должны создавать заявления динамически.

+0

Я вроде думал, что это невозможно ;-) –

0

В самом простом случае вы можете просто о делать это с CASE заявление, но это вряд ли будет много пользы в реальном мире:

with a as (
    select 'col_01_val_01' as col_01, 'col_02_val_01' as col_02, 
     'col_03_val_01' as col_03 from dual 
    union select 'col_01_val_02' as col_01, 'col_02_val_02' as col_02, 
     'col_03_val_02' as col_03 from dual 
    union select 'col_01_val_03' as col_01, 'col_02_val_03' as col_02, 
     'col_03_val_03' as col_03 from dual), 
b as (
    select 1 parm, 'col_01' value from dual 
    union select 2 parm, 'col_02' value from dual 
    union select 3 parm, 'col_03' value from dual) 
select b.value as result_from_b, 
    case b.value 
     when 'col_01' then col_01 
     when 'col_02' then col_02 
     when 'col_03' then col_03 end as result_from_a 
from a, b 
where b.parm = 1; 

RESULT_FROM_B RESULT_FROM_A 
------------- ------------- 
col_01  col_01_val_01 
col_01  col_01_val_02 
col_01  col_01_val_03 

Колонки должны быть одинаковыми тип (или, по крайней мере, выражаемый как таковой в случае), и b может возвращать только один ряд ... И это, конечно, не очень красиво. Для чего-то более сложного вам нужен динамический SQL, как уже указывал @a_horse_with_no_name.

0

Это может быть сделано в рамках хранимой процедуры в MySQL. Я не знаю об Oracle, поскольку я его не использовал. Вы можете узнать больше о хранимых процедурах MySQL here и here (вторая ссылка - довольно хороший PDF, в котором вы найдете несколько простых примеров).

+0

Требование было * решение без скриптов *, чтобы исключить хранимые процедуры. –

+0

@a_horse_with_no_name - Очень верно. Однако я решил, что это означает отсутствие внешних (для БД) сценариев, которые оставили сохраненные процедуры как единственный вариант. Без скриптов вообще, конечно, вы правы. – hellsgate

Смежные вопросы