如何使用相同的表模式查询多个SQL表?

时间:2017-09-13 02:30:02

标签: mysql sql mariadb

我有以下表格列表,这些表格是根据每周存档创建的。

dbtable
dbtable_01_04_2017
dbtable_01_07_2017
dbtable_02_09_2017
dbtable_03_06_2017
dbtable_05_08_2017
dbtable_06_05_2017
dbtable_08_04_2017
dbtable_08_07_2017
dbtable_09_09_2017
dbtable_10_06_2017
dbtable_12_08_2017
dbtable_13_05_2017
dbtable_15_04_2017
dbtable_15_07_2017
dbtable_17_06_2017
dbtable_19_08_2017
dbtable_20_05_2017
dbtable_22_04_2017
dbtable_22_07_2017
dbtable_24_06_2017
dbtable_26_08_2017
dbtable_27_05_2017
dbtable_29_04_2017
dbtable_29_07_2017

所有这些都具有完全相同的列结构:

TIME_STAMP,USERNAME,INFO,CAUSE

我需要使用相同的查询一次查询所有这些查询,当然只能通过更改以下示例查询中的表名。

 SELECT * FROM dbtable WHERE USERNAME="XXXX";

我google了一下,希望有一种方法可以在查询中使用通配符,但我知道SQL不支持。

基本上,我正在寻找某种for循环来将查询迭代到多个表。

请注意,我们会根据档案自动化每周添加新表格。

3 个答案:

答案 0 :(得分:2)

评论太长了。

问题在于您的数据结构。具有相同格式的多个表通常是个坏主意。您应该有一个表,其中包含日期列。

哦,等等,你关注性能,因为现有的每个表都很大。这就是(大多数)数据库支持分区的原因。您可以在documentation

中阅读相关内容

如果你不沿着那条路走下去,一种可能性就是创建一个包含所有表的视图 - 然后当你添加一个表时,改变视图以包含最新的表。当然,查询可能最终会读取所有表格,因此它们效率不高。

正确的解决方案是使用具有多个分区的单个表。

答案 1 :(得分:0)

您可以编写一个存储过程来查询哪些表存在并在这些表上执行SELECT

答案 2 :(得分:0)

UNION ALL是最终解决方案。

SELECT * FROM dbtable WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_01_04_2017 WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_01_07_2017 WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_02_09_2017 WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_03_06_2017 WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_05_08_2017 WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_06_05_2017 WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_08_04_2017 WHERE `USERNAME` LIKE '$variable'

通过使用上面的SQL查询,我能够实现我的需要。