我需要编写一个需要连接到另一个表的查询,但是表名和列名都存储在另一个表中。
我有两个表格如下:
表“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行
有什么建议吗?
答案 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''');