2012-02-26 274 views
3

该查询会运行,但它会生成表名作为结果,而不是实际从该表中选择。等同于“SELECT * FROM(SELECT table_name FROM ...)”的东西?

SELECT T.* 
    FROM (SELECT tablename 
      FROM ListOfTables 
     WHERE id = 0) AS T 

其中ListOfTables包含id=0, tablename='some_table',我想回到相同的结果,如果我写了这直接设置:

SELECT * FROM some_table 

有没有在MySQL 5为此原生的方式,还是我必须在应用程序中做?

+2

表名不能是动态的 - 你需要使用动态SQL,在你指定你正在使用的数据库之前,没有人能提供一个合理的例子。 – 2012-02-26 16:13:50

+0

本土方式做什么?目前还不清楚你想要达到的目标。 – 2012-02-26 16:14:00

+0

你期待什么结果?请显示表'ListOfTables'的结构和一些内容 – 2012-02-26 16:15:18

回答

3

你需要使用动态SQL来获得这个结果(下面的代码假设SQL Server,我不能说其他的RDBMS')。

declare @tableName varchar(100) 
declare @query varchar(500) 

select @tableName = tablename 
from ListOfTables 
where id = 0 

select @query = 'select * from ' + @tableName 

exec (@query) 
+0

你需要一个光标/ etc来循环访问表名列表 – 2012-02-26 16:25:09

+0

@OMGPonies我不认为OP想循环遍历所有表。 – 2012-02-26 16:28:29

0

与@Shark的答案几乎相同,只是还引用了表名以避免语法错误。

-- Using variables just for better readability. 
DECLARE @Name NVARCHAR(4000) 
DECLARE @Query NVARCHAR(4000) 

-- Get the relevant data 
SET @Name = QUOTENAME(SELECT tablename FROM ListOfTables WHERE id=0) 
-- Build query 
SET @Query = 'SELECT * FROM ' + @Schema + '.' + @Name + '' 
-- execute it. 
EXEC(@Query) 
5

为此在MySQL的,你需要创建一个prepared statement,你只能从user variable创建:在SQL

SELECT @tn := tablename FROM ListOfTables WHERE id = 0; 

SET @qs = CONCAT('SELECT * FROM ', @tn); 
PREPARE ps FROM @qs; 
EXECUTE ps; 
+0

那里'id'是一个参数呢? – spraff 2012-02-26 16:35:05

+0

我不明白。当然,您可以像往常一样从应用程序中提供id值。你甚至可以使第一个查询成为准备好的语句。 – AndreKR 2012-02-26 16:36:51

+0

我需要为PHP的所有'mysql_query'声明所有的声明 - 我正在玩弄它,但无法找到一种方法将所有内容合并到一起,而不会出现解析错误。 – spraff 2012-02-26 16:41:10

相关问题