作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在运行以下查询时 MYSQL
提示:表 'DB.tableName'
不存在。
CREATE PROCEDURE CountSignatures()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE signatureCount INT;
DECLARE tableName CHAR(100);
DECLARE tableList CURSOR FOR Select table_name from information_schema.tables where table_name like "%FAULT_20150320%";
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
SET signatureCount = 1;
OPEN tableList;
tableListLoop: LOOP
SET done = FALSE ;
FETCH tableList INTO tableName;
IF done THEN
LEAVE tableListLoop;
END IF;
**Select count(distinct signature) from tableName;**
END LOOP;
CLOSE tableList;
END$$
如果我使用以下查询,则 tableName
变量值会正确打印:
CREATE PROCEDURE CountSignatures()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE signatureCount INT;
DECLARE tableName CHAR(100);
DECLARE tableList CURSOR FOR Select table_name from information_schema.tables where table_schema="LogData" and table_name like "%FAULT_20150320%";
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
SET signatureCount = 1;
OPEN tableList;
tableListLoop: LOOP
SET done = FALSE ;
FETCH tableList INTO tableName;
IF done THEN
LEAVE tableListLoop;
END IF;
**Select tableName;**
END LOOP;
CLOSE tableList;
END$$
最佳答案
SELECT
语句的 FROM
部分必须有实际的表名,而不是包含名称的 CHAR(100)
变量 table 。它只是不能像这样工作。
您似乎想对数据库中具有相似结构的许多表运行特定查询。通常这意味着可以改进数据库模式。但是,如果你必须处理你拥有的东西,你将不得不使用 dynamic SQL . MySQL 文档的此链接有一个示例“演示了如何通过将表的名称存储为用户变量来选择在运行时执行查询的表”,这正是您所需要的。
在您的循环中,您需要使用 SQL 查询构建一个字符串并使用 EXECUTE
。
SET @s = CONCAT('select count(distinct signature) from ', tableName);
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
据我所知,EXECUTE
的结果被发送到存储过程的调用者,就好像它是一个普通的 SELECT
,所以在这个例子中如果您的数据库有多个表where table_name like "%FAULT_20150320%"
,调用者将收到多个结果集。
这是另一个关于 MySQL 动态 SQL 的 SO 问题的链接 How To have Dynamic SQL in MySQL Stored Procedure一些例子。
看起来你想要这样的东西。它应该在 signatureCount
变量中汇总来自多个表的计数。
CREATE PROCEDURE CountSignatures()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE signatureCount INT;
DECLARE tableName CHAR(100);
DECLARE tableList CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_name LIKE "%FAULT_20150320%";
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
SET signatureCount = 0;
OPEN tableList;
tableListLoop: LOOP
SET done = FALSE;
FETCH tableList INTO tableName;
IF done THEN
LEAVE tableListLoop;
END IF;
SET @VarCount = 0;
SET @VarSQL = CONCAT('SET @VarCount = (SELECT COUNT(DISTINCT signature) FROM ', tableName, ')');
PREPARE stmt FROM @VarSQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET signatureCount = signatureCount + @VarCount;
END LOOP;
CLOSE tableList;
SELECT signatureCount;
END$$
另一种变体,如果您需要处理的表数量不多,则动态构建一个包含循环内所有表的大型 SQL 语句,然后一次性EXECUTE
:
SELECT
(COUNT(DISTINCT signature) FROM Table1) +
(COUNT(DISTINCT signature) FROM Table2) +
...
(COUNT(DISTINCT signature) FROM TableN) AS TotalCount
关于mysql - 如何对数据库中的多个表运行相同的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29245791/
我是一名优秀的程序员,十分优秀!