相当于“SELECT * FROM (SELECT table_name FROM ...)”的东西?

Posted

技术标签:

【中文标题】相当于“SELECT * FROM (SELECT table_name FROM ...)”的东西?【英文标题】:Something equivalent to "SELECT * FROM (SELECT table_name FROM...)"? 【发布时间】:2012-03-16 07:31:58 【问题描述】:

此查询运行,但它会生成一个表的名称作为结果,而不是实际从该表中进行选择。

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

如果 ListOfTables 包含 id=0, tablename='some_table',我想返回相同的结果集,就像我直接写的一样:

SELECT * FROM some_table

mysql 5 中是否有本地方法可以做到这一点,还是我必须在应用程序中做到这一点?

【问题讨论】:

SQL 中的表名不能是动态的——您需要使用动态 SQL,在您指定使用的数据库之前,没有人可以提供合理的示例。 原生方式做什么?目前尚不清楚您要达到的目标。 你期待什么结果?请显示表'ListOfTables'的结构和一些内容 【参考方案1】:

要在 MySQL 中执行此操作,您需要创建一个 prepared statement,您只能从 user variable 创建:

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

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

【讨论】:

id 是哪里的参数呢? 我不明白。当然,您可以像往常一样从您的应用程序中输入 id 值。您甚至可以将第一个查询设为预准备语句。 我需要为 phpmysql_query 编写一个单独的语句——我正在使用它,但找不到一种方法将所有内容折叠在一起而不会出现解析错误。 这是因为,引用php.net/manual/en/function.mysql-query.php,不支持多个查询。您必须使用不同的客户端 API、创建存储过程或找到其他解决方案,可能在 ***.com/questions/345637/…【参考方案2】:

你需要使用动态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)

【讨论】:

你需要一个游标/等来循环遍历表名列表 @OMGPonies 我不认为 OP 想要循环遍历所有表格..?【参考方案3】:

与@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)

【讨论】:

以上是关于相当于“SELECT * FROM (SELECT table_name FROM ...)”的东西?的主要内容,如果未能解决你的问题,请参考以下文章

ERROR 1349:视图的 SELECT 在 FROM 子句中包含子查询

sqlserver 数据库 select top 10(*)from goods 有没有办法取得我想要的第几个数据

SQL-子查询;union;limit

右外连接和内连接使用三个select语句

sql 整理积累

sql 查询结果合并union all用法_数据库技巧