Mysql 循环中有一个FETCH。循环之前有一个初始获取,因此我们可以处理第一行的特殊情况。我被插入的弄糊涂了,在操作代码中,它正在做一个插入。。。选择endDateTable中每一行的,并对每一行执行该操作。我觉得这不太合适。在我看来,它的目的只是为了获得最高的修
Mysql 循环中有一个FETCH。循环之前有一个初始获取,因此我们可以处理第一行的特殊情况。我被插入的弄糊涂了,在操作代码中,它正在做一个插入。。。选择endDateTable中每一行的,并对每一行执行该操作。我觉得这不太合适。在我看来,它的目的只是为了获得最高的修,mysql,loops,variables,stored-procedures,prepared-statement,Mysql,Loops,Variables,Stored Procedures,Prepared Statement,循环中有一个FETCH。循环之前有一个初始获取,因此我们可以处理第一行的特殊情况。我被插入的弄糊涂了,在操作代码中,它正在做一个插入。。。选择endDateTable中每一行的,并对每一行执行该操作。我觉得这不太合适。在我看来,它的目的只是为了获得最高的修订号,但我只是猜测。是的,如果我们想要finalTable中有多行,我们可以在循环中插入。再说一次,我甚至不清楚为什么我们需要一个循环,为什么不在一个SQL语句中这样做呢?原始代码在每次获取后都会进行一次插入,先有条件地递增@revisionN
循环中有一个
FETCH
。循环之前有一个初始获取,因此我们可以处理第一行的特殊情况。我被插入的弄糊涂了,在操作代码中,它正在做一个插入。。。选择endDateTable中每一行的
,并对每一行执行该操作。我觉得这不太合适。在我看来,它的目的只是为了获得最高的修订号,但我只是猜测。是的,如果我们想要finalTable中有多行,我们可以在循环中插入。再说一次,我甚至不清楚为什么我们需要一个循环,为什么不在一个SQL语句中这样做呢?原始代码在每次获取后都会进行一次插入,先有条件地递增@revisionNum
。据我所知,目的是为endDateTable
中的每一行获取一行,而RevisionNum
的值在每一行中都会发生变化。OP code在每次提取后都会执行insert,它会执行insert。。。选择。。。从endDateTable
进行每次提取。插入n行的n个副本。是的,我们可以将INSERT
移动到循环中,这样就可以为获取的每一行执行一次。
BEGIN
DECLARE _currentEndDate DATETIME DEFAULT now();
DECLARE _priorEndDate DATETIME DEFAULT now();
SET @ResultsCount = (SELECT COUNT(*) FROM mainTable);
SET @j = 0;
WHILE @j < @ResultsCount DO
SET @revisionNum = 0;
/*CURRENT END DATE*/
SET @appResultQueryCurrent = CONCAT('
SELECT
end_date
INTO _currentEndDate
FROM endDateTable
LIMIT ', @j, ', 1'
);
PREPARE currentQueryStmt FROM @appResultQueryCurrent;
EXECUTE currentQueryStmt;
/*PREVIOUS END DATE*/
SET @appResultQueryPrior = CONCAT('
SELECT
end_date
INTO _priorAppEndDate
FROM endDateTable
LIMIT ', IF(@j = 0, 0, @j - 1), ', 1'
);
PREPARE priorQueryStmt FROM @appResultQueryPrior;
EXECUTE priorQueryStmt;
SET @revisionNum = IF(
@j = 0 OR (_currentEndDate = _priorEndDate),
@revisionNum,
IF(
_currentEndDate != _priorEndDate,
@revisionNum + 1,
@revisionNum
)
);
INSERT INTO finalTable (RevisionNum)
SELECT
@revisionNum AS RevisionNum
FROM endDateTable;
SET @j = @j +1;
END WHILE;
END $$
INSERT INTO finalTable (RevisionNum, otherColumn)
SELECT revision, otherColumn
FROM (
SELECT IF(end_date = @prev_end_date, @revision, @revision := @revision + 1) AS revision,
@prev_end_date := end_date,
otherColumn
FROM endDateTable
CROSS JOIN (SELECT @prev_end_date := NULL, @revision := -1) AS vars
ORDER BY id) AS x
BEGIN
DECLARE ld_current_end_date DATETIME;
DECLARE ld_prior_end_date DATETIME;
DECLARE li_done INT;
DECLARE li_revision_num INT;
DECLARE lcsr_end_date CURSOR FOR SELECT t.end_date FROM `endDateTable` t ORDER BY NULL;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET li_done = TRUE;
SET li_done = FALSE;
SET li_revision_num = 0;
OPEN lcsr_end_date;
FETCH lcsr_end_date INTO ld_current_end_date;
SET ld_prior_end_date = ld_current_end_date;
WHILE NOT li_done DO
SET li_revision_num = li_revision_num + IF( ld_current_end_date <=> ld_prior_end_date ,0,1);
SET ld_prior_end_date := ld_current_end_date;
FETCH lcsr_end_date INTO ld_current_end_date;
END WHILE;
CLOSE lcsr_end_date;
INSERT INTO `finalTable` (revisionnum) VALUES (li_revision_num);
END $$