Mysql 对所有表执行查询,并在新表中填写数据
我需要得到带有这些字段的结果表 -表名称、最小日期、最大日期 这是我的查询,我应该为所有表执行Mysql 对所有表执行查询,并在新表中填写数据,mysql,sql,Mysql,Sql,我需要得到带有这些字段的结果表 -表名称、最小日期、最大日期 这是我的查询,我应该为所有表执行 SELECT MIN(short_date) as FirstDuplicatedDate, MAX(short_date) as LastDuplicatedDate FROM (SELECT short_date, type, value, count(*) as cnt FROM testTable GROUP BY short_date HAVING COUNT(*) > 1) a
SELECT MIN(short_date) as FirstDuplicatedDate, MAX(short_date) as LastDuplicatedDate
FROM (SELECT short_date, type, value, count(*) as cnt
FROM testTable
GROUP BY short_date
HAVING COUNT(*) > 1) as Duplicates
然后我发现了如何获取所有表名
我是这样做的
SELECT TABLE_NAME as name FROM `information_schema`.`TABLES`
WHERE `TABLES`.`TABLE_SCHEMA` = 'test'
AND `TABLES`.`TABLE_NAME` LIKE 'test%'
DECLARE @DB_Name varchar(50)
DECLARE @Command varchar(100);
DECLARE database_cursor CURSOR FOR
SELECT name
FROM (SELECT TABLE_NAME as name FROM `information_schema`.`TABLES`
WHERE `TABLES`.`TABLE_SCHEMA` = 'test'
AND `TABLES`.`TABLE_NAME` LIKE 'test%') as TableNames
OPEN database_cursor
FETCH NEXT FROM database_cursor INTO @DB_Name
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @Command = 'SELECT MIN(short_date) as FirstDuplicatedDate, MAX(short_date) as LastDuplicatedDate
FROM (SELECT short_date, type, value, count(*) as cnt
FROM ' + @DB_Name + '
WHERE type = ''test''
GROUP BY short_date, type, value
HAVING COUNT(*) > 1) as Duplicates'
EXEC sp_executesql @Command
FETCH NEXT FROM database_cursor INTO @DB_Name
END
CLOSE database_cursor
DEALLOCATE database_cursor
但我不知道如何对所有表执行它,并将结果填入新表中
我试着这样做
SELECT TABLE_NAME as name FROM `information_schema`.`TABLES`
WHERE `TABLES`.`TABLE_SCHEMA` = 'test'
AND `TABLES`.`TABLE_NAME` LIKE 'test%'
DECLARE @DB_Name varchar(50)
DECLARE @Command varchar(100);
DECLARE database_cursor CURSOR FOR
SELECT name
FROM (SELECT TABLE_NAME as name FROM `information_schema`.`TABLES`
WHERE `TABLES`.`TABLE_SCHEMA` = 'test'
AND `TABLES`.`TABLE_NAME` LIKE 'test%') as TableNames
OPEN database_cursor
FETCH NEXT FROM database_cursor INTO @DB_Name
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @Command = 'SELECT MIN(short_date) as FirstDuplicatedDate, MAX(short_date) as LastDuplicatedDate
FROM (SELECT short_date, type, value, count(*) as cnt
FROM ' + @DB_Name + '
WHERE type = ''test''
GROUP BY short_date, type, value
HAVING COUNT(*) > 1) as Duplicates'
EXEC sp_executesql @Command
FETCH NEXT FROM database_cursor INTO @DB_Name
END
CLOSE database_cursor
DEALLOCATE database_cursor
但我犯了这个错误
语法错误或访问冲突:1064您的SQL中有错误
句法;检查与MySQL服务器版本对应的手册
对于要使用near'DECLARE@DB_Name varchar(50)DECLARE的正确语法
@第1行的命令varchar(100)'
UPD
CREATE PROCEDURE GetData()
BEGIN
DECLARE @DB_Name varchar(50), @Command varchar(100);
DECLARE database_cursor CURSOR FOR
SELECT name
FROM (SELECT TABLE_NAME as name FROM `information_schema`.`TABLES`
WHERE `TABLES`.`TABLE_SCHEMA` = 'test'
AND `TABLES`.`TABLE_NAME` LIKE 'test%_') as TableNames
OPEN database_cursor
FETCH NEXT FROM database_cursor INTO @DB_Name
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @Command = 'SELECT MIN(short_date) as FirstDuplicatedDate, MAX(short_date) as LastDuplicatedDate
FROM (SELECT short_date, type, value, count(*) as cnt
FROM ' + @DB_Name + '
WHERE type = ''test''
GROUP BY short_date, type, value
HAVING COUNT(*) > 1) as Duplicates'
EXEC sp_executesql @Command
FETCH NEXT FROM database_cursor INTO @DB_Name
END;
CLOSE database_cursor
DEALLOCATE database_cursor
END;
CALL GetData()
在开始处添加分隔符$$;添加
分隔符代码>在结束后
摆脱声明命令。而是使用不需要声明的@命令
添加SELECT@command代码>在选择@命令之后:=代码>以便我们可以进行一些调试
关闭
和解除分配
语句需要代码>以终止它们
测试要提取的行数是否不足
您确实需要看一些存储过程的示例,特别是那些带有游标的存储过程
更新
啊,我甚至没有发现一半的语法错误。这可能有用(我不知道,因为我没有您特定的表或列):
据我所知,这个错误是由于,DELIMETER
和另外一件事,您必须正确地应用游标来迭代整个行集
。在下面的代码中,我用游标
写下了过程
。进行动态查询并使用
PREPARE stmt FROM @VAR_QRY; EXECUTE stmt;
动态查询将返回您想要的确切输出。这里我假设您对触发器
、循环
和光标
试试下面的代码。
希望这会有所帮助
DROP PROCEDURE IF EXISTS ITERATEALLTABLE;
DELIMITER $$
CREATE PROCEDURE ITERATEALLTABLE()
BEGIN
DECLARE VAR_TABLE varchar(100);
DECLARE VAR_QRY varchar(100);
DECLARE VAR_FINISHED INT(11) DEFAULT 0;
DECLARE DATABASE_CURSOR CURSOR FOR
SELECT name AS TableNames
FROM (
SELECT TABLE_NAME as name FROM `information_schema`.`TABLES`
WHERE `TABLES`.`TABLE_SCHEMA` = 'test'
AND `TABLES`.`TABLE_NAME` LIKE 'test%'
)Z ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET VAR_FINISHED = 1;
OPEN DATABASE_CURSOR;
GET_NEXTRECORD: LOOP
FETCH DATABASE_CURSOR INTO VAR_TABLE;
IF VAR_FINISHED = 1 THEN
LEAVE GET_NEXTRECORD;
END IF;
SET @VAR_QRY = CONCAT("SELECT MIN(short_date) as FirstDuplicatedDate, MAX(short_date) as LastDuplicatedDate
FROM (SELECT short_date, type, value, count(*) as cnt
FROM " , VAR_TABLE , " WHERE type = 'test'
GROUP BY short_date, type, value
HAVING COUNT(*) > 1) as Duplicates");
PREPARE stmt FROM @VAR_QRY;
EXECUTE stmt;
END LOOP GET_NEXTRECORD;
CLOSE DATABASE_CURSOR;
END;
CALL ITERATEALLTABLE;
对。。。你可能想试试这个
删除此行,然后再次运行查询
DECLARE @DB_Name varchar(50), @Command varchar(100);
我认为在mysql中,您可以只使用变量而不声明它,然后在必要时强制转换。您已经标记了sql server和mysql。由于错误消息引用了mysql,SQLServerOne肯定是错误的。请把它取下来。谢谢。我还应该说删除t-sql,因为这是sql Server(而不是MySQL)上使用的sql的风格。你能举一个例子说明你试图做什么exactlySQLSTATE[42000]:语法错误或访问冲突:1064你的sql语法有错误;查看与您的MySQL服务器版本对应的手册,以了解使用“DELIMITER$$什么版本的MySQL”附近的正确语法?在分隔符
和$$
之间是否有空格?您使用哪个客户端将其发送到MySQL服务器?(我使用的是mysql命令行工具。)在删除
之前是否有另一个分隔符
语句?以及我之前评论中的问题?再次尝试应用我的代码——这次添加立即选择()紧靠分隔符$$
之前的code>。声明中的VAR\u QRY
与@VAR\u QRY
完全不同。