2013-07-07 2 views
0

Мне нужно написать запрос, который требует присоединения к другой таблице, но имя таблицы и имя столбца хранятся в другой таблице.Как использовать JOIN, когда имя таблицы и имя столбца хранятся в другой таблице?

У меня есть две таблицы, которые перечислены ниже:

Таблица "description_tab": (ID, type_id, REFERENCE_ID, название, описание)

Таблица "description_tab_type": (ID, type_name, reference_table, reference_column_name, reference_column_id)

где description_tab_type содержит имя другой таблицы и двух столбцов, которые мне нужны для JOIN.

Я попытался динамический SQL:

SELECT reference_table, reference_column_name, reference_column_id 
INTO @reference_table, @reference_column_name, @reference_column_id 
FROM description_tab_type WHERE type_name = 'Origin'; 

PREPARE statement FROM "select dt.description from description_tab dt join @reference_table on @[email protected]_column_id = dt.reference_id where @[email protected]_column_name = 'test'"; 

EXECUTE statement; 

DEALLOCATE PREPARE statement; 

но это не сработало. Когда я запускаю его, я получаю следующее:

У вас возникла ошибка в синтаксисе SQL; в руководстве, соответствует версии сервера MySQL для правильного синтаксиса, чтобы использовать вблизи «@reference_table на @ reference_table. @ reference_column_id = dt.reference_id где @refere» в строке 1

какие-либо предложения?

+0

Строка sql неверна, используйте concat(). http://stackoverflow.com/questions/8363415/why-cant-i-use-a-variable-as-the-table-name-in-a-stored-procedure/8363487#8363487 – goat

+0

динамический оператор SQL является единственным выход здесь. – TheVillageIdiot

ответ

1

Я не думаю, что MySQL будет делать то, что вы хотите в одном утверждении. (На самом деле, я думаю, что это вне синтаксиса SQL).

Я думаю, что вам нужно сделать, это в три этапа:

1) Query the reference table for the table and column names you need 

2) Assemble the query by concatenating it around the values you retrieved in step 1 

3) Submit/Prepare the new query. 
1

Попробуйте установить соответствующее значение переменной первого:

set @query = concat('select dt.description from description_tab dt join ', 
        @reference_table, ' r ', 
        'on r.', @reference_column_id, ' = dt.reference_id ' 
        'where rt.', @reference_column_name = \'test\'' 
        ); 



PREPARE statement FROM @query; 

EXECUTE statement; 

DEALLOCATE PREPARE statement; 
0

Я не знаком с подготовки заявления, но попробовать это:

Execute ('select dt.description from description_tab dt join' + @reference_table + 'on' + @reference_table + '.' + @reference_column_id + '= dt.reference_id где' + @reference_tabl e + '.' + @reference_column_name + '=' 'test' '');