1

我有一个名为“name”的列,它存在于 mysql 数据库的所有表中。

我想列出所有表中的所有名称,所以我使用了以下查询

select name from (SELECT table_name FROM information_schema.tables WHERE table_type='BASE TABLE') as abc

但它对我不起作用,而是单独返回了 table_name 列。

然后我使用显示表并将输出存储在另一个名为 table_list 的表中,然后我执行以下查询

select name from (select table_name from table_list) as abc

这也返回了相同的结果,即所有表名。

我能知道我做错了什么以及正确的方法是什么吗?

我正在使用 MySQL 5.4,我想纯粹在 mysql 中编写子查询或过程或函数。

4

2 回答 2

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;

于 2009-07-22T14:21:34.483 回答
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 然后运行它),您可以这样做。我检查了文档,看起来没有评估。你也可以用 C 语言编写一个扩展(见第 22 章),实现查找或“eval”函数。

但我的猜测是你的数据库不会一直改变。所以最简单的解决方案是编写一个小的 SQL 脚本来创建视图代码(这是一个字符串;它实际上并不创建视图)。每次数据库更改时,您只需运行脚本来重新创建视图,然后,您可以对视图运行查询以获取所有名称的列表。

于 2009-07-22T08:50:23.153 回答