相当于“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 值。您甚至可以将第一个查询设为预准备语句。
我需要为 php 的 mysql_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 子句中包含子查询