gpt4 book ai didi

sql - MySQL SELECT 从一组从 INFORMATION_SCHEMA 检索的表中

转载 作者:可可西里 更新时间:2023-11-01 08:22:22 24 4
gpt4 key购买 nike

大家好。我有以下一组表格,这些表格是可变的并且每天都会累加:

data-2010-10-10
data-2010-10-11
data-2010-10-12
data-2010-10-13

等等。所有表都具有相同的结构,我想做的是一次从所有表中选择内容。我无法使用 MERGE 表,因为我正在运行 InnoDB。无论如何,我正在使用以下语句从我的 information_schema 中选择表名:

select table_name from `information_schema`.`tables` 
where `table_schema` = 'mydb2' and `table_name` like 'data-%'

返回所有我想合并的表。我还可以对返回的结果进行 group_concat 以获取以逗号作为分隔符的列表。现在我遇到的问题是运行一个选择查询,该查询实际上会从这些表中检索数据。

感谢任何提示。谢谢! ~K

最佳答案

您必须使用动态 SQL 构建查询(或多个查询)才能从这些表中获取结果。也就是说,您从 information_schema 查询中将表作为字符串返回,然后将这些字符串插入到进一步的查询中。

涉及针对所有表的单个查询的 UNION:

SELECT ...
FROM (SELECT * FROM `data-2010-10-10`
UNION ALL SELECT * FROM `data-2010-10-11`
UNION ALL SELECT * FROM `data-2010-10-12`
UNION ALL SELECT * FROM `data-2010-10-13`) AS u

但我质疑您每天创建一个单独表格的设计。一开始这似乎是一件很方便的事情,但是表传播失控了,你最终会在执行普通查询时遇到困难,就像你现在面临的困难一样。这是 antipattern我称之为元数据问题

您的数据很可能会存储在一个表中,并使用日期列来区分不同日期的数据。您可能只需要创建索引来协助您需要针对总数据运行的查询。


回复你的评论:

您不能在 SQL 查询(包括 View 定义)中使表名动态化。您可以将表名插入字符串,然后将该字符串准备为 SQL 查询。

您可以使用 CONCAT() 构建一个字符串函数,然后使用 PREPARE and EXECUTE将字符串作为查询运行。但是由于 mysql 客户端中没有循环结构,如果您不能用 Python 或 PHP 或某些此类宿主语言编写脚本,则必须编写一个存储过程来执行此操作。

关于sql - MySQL SELECT 从一组从 INFORMATION_SCHEMA 检索的表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3902013/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com