sql从列中描述的表名中选择

dbf7pr2w  于 2021-06-19  发布在  Mysql
关注(0)|答案(3)|浏览(253)

我想从另一个表中描述了表名的sql表中进行选择。

SELECT * 
FROM first_table t1 
WHERE EXISTS (SELECT * FROM t1.other_table t2 WHERE t1.other_table_id = t2.id)

找不到解决方法!
谢谢你的帮助。

sqougxex

sqougxex1#

解决方案

可以在查询中使用动态变量:

SET @table := (select tableName from test limit 1);
set @qry1:= concat('select * from ',@table);
prepare stmt from @qry1 ;
execute stmt ;

甚至:

set @qry1:= concat('select * from ', (select tableName from test limit 1));
select @qry1;
prepare stmt from @qry1 ;
execute stmt ;

sqlfiddle公司example:http://sqlfiddle.com/#!9/a787e3/1号
注意:sqlfiddle不允许运行 execute 在正确的编辑器中,所以我必须使用一个视图。

免责声明/注解:

您应该清理tablename表的所有输入。这样就不会有人将sql插入这个表并执行它。
此外,请注意,在一个真实的数据库中,我们将有一个 where 表选择查询的条件。
例子:

set @qry1:= concat('select * from ', (select tableName from test where id='something'));
g2ieeal7

g2ieeal72#

SELECT * 
   FROM first_table t1 
    WHERE EXISTS (SELECT * FROM other_table t2 WHERE t1.other_table_id = t2.id)
yqyhoc1h

yqyhoc1h3#

mysql> SELECT @other_table := other_table FROM first_table WHERE 1 = 1;
mysql> SET @s = CONCAT("SELECT * FROM ", @other_table);
mysql> PREPARE stmt FROM @s;
mysql> EXECUTE stmt;
mysql> DEALLOCATE stmt;

在这里 WHERE 1=1 应更改为只返回结果集中的一行

相关问题