跨多个数据库查找公共数据

Find Common data across multiple databases

我是 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.

首先,从 information_schema.columns 创建 MySQL 查询:

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; 

这是一个演示 fiddle:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=2c4b26ba2f46430ab2c196b30aedc38f