2013-03-17 72 views
0

我想创建一个数据库,其中有一个存储在表中的表名列表。现在借助这个列表,我可以访问其他表格。从表中获取表名并使用表名访问数据

例如: -

Table name :- table_list (2 column i.e. table_name,table_id) 
table_list attributes 
authentication 1 
basic_info 2 
contact 3 

我可以直接访问使用SELECT语句这些表,但我想用table_list表最好使用select语句来访问它们。

我试图

select * from (select table_name as x from table_list where id=2) as y 

,但无法获得正确的输出。

+1

什么是你想实现请告诉我保存表名的地步?在另一个表中。如果出于安全目的,您可以创建视图并对用户进行有限访问。 – ntstha

+0

对于我的项目,我已经创建了视图。但我想实现一些动态的方法来从各种表中检索数据。而且这种方法可以提供安全性,这是一个加点。 –

回答

0
TRY THIS 

select * from (SELECT TABLE_NAME FROM TABLE_LIST WHERE ID=2)as y 
+0

该语句将返回TABLE_LIST中'TABLE_NAME'列的值。这与OP发布的查询有什么不同? – spencer7593

+0

我已经试过这个。但这不起作用。 –

0

既然你相信,你要访问的表名是X,只是检查是否使用查询和使用X为未来的用途,例如一个表中。

2

它被称为Prepared Statements它们的唯一用途是当你想在一个请求中实现你提到的需求。否则,您可以使用编程语言轻松检索表名并使用手中的数据创建下一个语句。下面是如何Prepared Statements工作:

SELECT table_name INTO @tbl FROM my_tables WHERE id = 1 LIMIT 1; 
SET @sql := CONCAT('SELECT * FROM ', @tbl); 
PREPARE stmt1 FROM @sql; 
EXECUTE stmt1; 
DEALLOCATE PREPARE stmt1; 
+0

对不起,我没有时间去测试它。你是对的,它不工作。我已经更新了它,所以它的工作原理。感谢您指出。 – Mehran

+0

+1。这现在看起来可行。 – spencer7593

+0

'SELECT getname.tbnm INTO @tbl FROM getname WHERE getname.id = 1 LIMIT 1; SET @sql:= CONCAT('SELECT * FROM',@tbl); PREPARE stmt1 FROM @sql; EXECUTE stmt1;' @Mehran我试过你的陈述,除了最后一个'DEALLOCATE PREPARE stmt1;'外,一切都变得完美了。 –

0

表名(“标识符”)必须issed到数据库的SQL文本的静态部分;该标识符不能“随时”提供,无论是作为参数还是来自另一个SQL查询的结果。

要做你想做的事情,你需要两步走。您可以使用一个(或多个)SQL语句来获取所需的标识符(表名,列名等),然后使用它作为字符串动态创建第二个SQL语句。

标识符(表名,列anmes)不能作为参数或“绑定变量”提供,它们必须是SQL文本的静态部分。

例如,生成声明:

SELECT CONCAT('SELECT * FROM `',table_name,'` ORDER BY 1') AS stmt 
    FROM table_list 
WHERE id = 2 

(编码细节取决于你使用的是什么语言。)