如何从db数据库的同结构多表中查询指定key的所有行?
解决多同结构表的统一查询问题
嘿,这个需求其实很好解决!核心就是用UNION ALL把各个表的查询结果合并起来,下面给你一步步说清楚:
基础解决方案(手动指定表)
如果你的表数量不多,直接写UNION ALL拼接每个表的查询语句就行——因为你所有表结构完全一致,所以每个子查询的格式都一样:
SELECT `key`, `value` FROM table_1 WHERE `key` = 'x' -- 替换成你要查询的key值 UNION ALL SELECT `key`, `value` FROM table_2 WHERE `key` = 'x' UNION ALL SELECT `key`, `value` FROM table_3 WHERE `key` = 'x' -- 继续添加更多table_n的查询语句,直到所有表都包含进来
为什么用UNION ALL而不是UNION?
UNION会自动去重结果,但你需要保留所有匹配的行(比如例子里的三个'1'对应的value),所以用UNION ALL更合适UNION ALL不需要做重复检查,执行效率比UNION更高
用你给出的测试数据,当key='1'时,这个查询返回的结果就是:
| key | value |
|---|---|
| 1 | aaa |
| 1 | bbb |
| 1 | ccc |
完全符合你的预期!
进阶解决方案(表数量多的时候用动态SQL)
如果你的表特别多(比如table_1到table_100),手动写所有表太麻烦,可以用数据库的系统表来动态生成查询语句(以MySQL为例):
-- 生成动态查询语句 SELECT CONCAT( 'SELECT `key`, `value` FROM ', GROUP_CONCAT(table_name SEPARATOR ' WHERE `key` = ''x'' UNION ALL SELECT `key`, `value` FROM '), ' WHERE `key` = ''x''' ) AS dynamic_sql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'db' -- 替换成你的数据库名 AND table_name LIKE 'table_%'; -- 匹配你的表名规则,比如以table_开头
执行这个语句会得到一个完整的UNION ALL查询语句,直接复制执行就能得到所有表中key='x'的行啦~
内容的提问来源于stack exchange,提问作者Haggai Magen
相关产品推荐
相关产品推荐

