我有以下表格列表,这些表格是根据每周存档创建的。
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循环来将查询迭代到多个表。
请注意,我们会根据档案自动化每周添加新表格。
答案 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查询,我能够实现我的需要。