当表名和列名存储在另一个表中时如何使用JOIN?

时间:2013-07-07 23:23:58

标签: sql join mysqli

我需要编写一个需要连接到另一个表的查询,但是表名和列名都存储在另一个表中。

我有两个表格如下:

表“description_tab”:( id,type_id,reference_id,name,description)

表“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 @reference_table.@reference_column_id = dt.reference_id where @reference_table.@reference_column_name = 'test'";

EXECUTE statement;

DEALLOCATE PREPARE statement;

但它不起作用。当我运行它时,我得到以下内容:

  

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   @ reference_table附近的@reference_table。@ reference_column_id =   dt.reference_id其中@refere'在第1行

有什么建议吗?

3 个答案:

答案 0 :(得分: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 :(得分: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;

答案 2 :(得分:0)

我不熟悉准备声明,但试试这个:

执行('从description_tab dt join'+选择dt.description'+'@ reference_table +'on'+ @reference_table +'。'+ @ reference_column_id +'= dt.reference_id where'+ @ reference_table +'。'+ @ reference_column_name +'=''test''');