我有一个名为“name”的列,它存在于mysql数据库的所有表中。
我想列出所有表中的所有名称,所以我使用了以下查询
select name from (SELECT table_name FROM information_schema.tables WHERE table_type='BASE TABLE') as abc
但它对我不起作用,而是单独返回table_name列。
然后我使用show tables并将输出存储在另一个名为table_list的表中,然后我执行了以下查询
select name from (select table_name from table_list) as abc
这也给我带来了相同的结果,即所有的表名。
我能知道我做错了什么,做正确的方法是什么?
我正在使用MySQL 5.4,我想要在mysql中编写子查询或过程或函数。
答案 0 :(得分:2)
有PREPARE和EXECUTE可以从用户变量中运行一个sql语句,所以可能会使用类似的(未经测试!)
SET @a = "";
SELECT @a := CONCAT('(select name from ',GROUP_CONCAT(table_name SEPARATOR ') UNION (select name from '),')') FROM information_schema.tables WHERE table_type='BASE TABLE' GROUP BY 1;
PREPARE stmt FROM @a;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
答案 1 :(得分:1)
你需要的是一种在SQL中拥有变量的方法(所以你可以说select * from $name where $name in (select ...)
)。 SQL不允许这样做。
我的建议是将过程分开:
首先运行此查询:
select 'select distinct name from ' || table_name || ' union'
from select table_name from table_list
那将给你选择运行。将它们放入一个小脚本中,删除最后一个“联合”并运行该脚本。
[编辑]如果MySQL在存储过程中支持“eval”运算符(即可以从部件构建SQL然后运行它),则可以执行此操作。我检查了文档,看起来没有eval。您也可以在C中编写一个扩展(参见chapter 22),它可以实现查找或“eval”函数。
但我的猜测是你的数据库不会一直改变。因此,最简单的解决方案是编写一个小的SQL脚本,为视图创建代码(这是一个字符串;它实际上并不创建视图)。每次数据库更改时,只需运行脚本重新创建视图,然后,您可以对视图运行查询以获取所有名称的列表。