mysql - 跨多个数据库查找公共数据
问题描述
我是 MySQL 的新手,我的老板给了我一个具有挑战性的任务。
任务是,构建一个存储过程,查询不同数据库中的不同表并查找表之间的公共数据(不包括 ID,仅 varchar 列)。我在网上找到了解决方案,但由于这个问题,它们不适合我的方案:
并非所有列都具有相同的名称。有时该列称为“accnt_no”,有时称为“account_number”或“accnt_nmbr”。这只是列名差异的一个示例。有许多列名不匹配的示例。
我构建了一个语句来查询这样的模式表:
SELECT TABLE_SCHEMA AS DBNAME, TABLE_NAME AS TNAME, COLUMN_NAME AS CNAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA IN ('db1','db2','db3','db4','db5')
AND TABLE_NAME IN ('table_1','table_2','table_3','table_4','table_5','table_6','table_7','table_8','table_9','table_10','table_11','table_12','table_13','table_14','table_15','table_16')
AND DATA_TYPE = 'varchar'
ORDER by 1, 2, 3;
希望,我可以迭代结果并构建一些动态查询,例如:
select CNAME from DBNAME.TNAME WHERE...(显然,这种语法不起作用)。但是不知道如何从这个结果集中构建查询的语法,除了说它可能需要嵌套循环。我一个月前刚开始在这家公司工作,所以我真的无法向任何人讲授他们的命名约定。
任何想法,将不胜感激。
解决方案
我能想到的一种可能的方法是使用prepared statement。
首先,从以下位置创建 MySQL 查询information_schema.columns
:
SET @sql := NULL;
SELECT GROUP_CONCAT(
CONCAT("SELECT ",COLUMN_NAME," FROM ",TABLE_SCHEMA,".",TABLE_NAME)
SEPARATOR " UNION ALL ")
INTO @sql
FROM information_schema.COLUMNS
/*WHERE TABLE_SCHEMA IN ('db1','db2','db3','db4','db5')*/
WHERE TABLE_NAME IN ('table1','table2','table3','table4')
AND DATA_TYPE = 'varchar'
AND COLUMN_NAME LIKE "acc%"
AND COLUMN_NAME LIKE "%_n%";
如果您SELECT @sql;
在执行上述查询后执行,您将得到如下结果:
SELECT acc_no FROM db_366220190.table1 UNION ALL
SELECT account_no FROM db_366220190.table2 UNION ALL
SELECT acct_number FROM db_366220190.table3 UNION ALL
SELECT acc_num FROM db_366220190.table4
然后,您只需准备语句,执行然后使用以下命令解除分配:
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
这是一个演示小提琴:https ://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=2c4b26ba2f46430ab2c196b30aedc38f
推荐阅读
- c++ - 给定一个数组和整数 k 在每个大小为 k 的子数组中找到最大值
- android - Firestore 离线同步大量数据
- laravel - laravel 多次读取数据
- haskell - 如何将 Applicative 上下文添加到 Lens 的 MyDataType 预期的类型?
- react-native - 使用“react-native-navigation”进行导航
- javascript - 将txt文件导入模态体
- r - 在 r 中的数据集中注入异常值
- javascript - 有没有办法用全局变量循环这个?
- javascript - 将 HOC 与 react-navigation Navigator 一起使用
- python - TKInter 按钮更改或销毁