跨多个数据库查找通用数据

时间:2021-03-29 17:51:51

标签: mysql mysql-workbench

我是 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...(显然,这种语法不起作用)。但是不知道如何从这个结果集中构建查询的语法,只能说它可能需要嵌套循环。我一个月前刚开始在这家公司工作,所以我真的无法向任何人讲授他们的命名约定。

任何想法将不胜感激。

1 个答案:

答案 0 :(得分:0)

我能想到的一种可能的方法是使用 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; 

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

相关问题