Mysql 无法解释的“子查询返回超过1行”错误
下面是一系列非常简单的sql查询MySQl 8.0Mysql 无法解释的“子查询返回超过1行”错误,mysql,sql,subquery,Mysql,Sql,Subquery,下面是一系列非常简单的sql查询MySQl 8.0 drop table IF EXISTS stack_Compare; drop table IF EXISTS lastNode; CREATE TABLE stack_Compare (Station VARCHAR(20), Track INT); CREATE TABLE lastNode (Last_Station_ID INT, I INT); AlTER table lastNode ADD PRimary key (I)
drop table IF EXISTS stack_Compare;
drop table IF EXISTS lastNode;
CREATE TABLE stack_Compare (Station VARCHAR(20), Track INT);
CREATE TABLE lastNode (Last_Station_ID INT, I INT);
AlTER table lastNode ADD PRimary key (I);
INSERT INTO lastNode VALUES (1, 1);
Drop trigger IF EXISTS lastAdded;
DELIMITER $$
CREATE TRIGGER lastAdded AFTER INSERT
ON stack_Compare FOR EACH ROW
BEGIN
UPDATE lastNode SET Last_Station_ID = (SELECT Station.Station_ID FROM Station, stack_Compare WHERE New.Station = Station.Name) WHERE I = 1;
END $$
DELIMITER ;
DROP PROCEDURE IF EXISTS insertStation;
DROP PROCEDURE IF EXISTS insertMain;
DELIMITER $$
SET max_sp_recursion_depth=3;
CREATE PROCEDURE insertStation (insertstationID INT, starter VARCHAR(20), destination VARCHAR(20))
this_procedure:BEGIN
DECLARE nextNode INT DEFAULT NULL;
INSERT INTO stack_Compare (Station)
SELECT Name from Station WHERE Station_ID = insertstationID;
IF insertStationID IN (SELECT Station_ID FROM Station WHERE Name = destination)
THEN LEAVE this_procedure;
END IF;
SET nextNode = (SELECT Next_Station FROM Station WHERE Station_ID = insertstationID);
IF nextNode IS NULL
THEN LEAVE this_procedure;
END IF;
IF nextNode = -1
THEN LEAVE this_procedure;
ELSE CALL insertStation (nextNode, starter, destination);
END IF;
END
$$
CREATE PROCEDURE insertMain (starter VARCHAR(20), destination VARCHAR(20))
BEGIN
DECLARE nextNode INT DEFAULT NULL;
CALL insertStation(8, starter, destination);
loop1: LOOP
SET nextNode = (SELECT Station.Next_Station FROM Station, lastNode WHERE Station.Station_ID = lastNode.Last_Station_ID);
IF nextNode IN (SELECT Station_ID FROM Station WHERE Name = destination)
THEN LEAVE loop1;
END IF;
END LOOP loop1;
END;
$$
DELIMITER ;
CALL insertMain('G1','RG');
SELECT * FROM stack_Compare;
select * from lastNode;
车站的桌子是
因此,基本上查询SELECT*fromStackCompare应该给出
Station
G2
RG
但它只在其中显示G2,错误是子查询返回的行多于1行
在过去的几个小时里,我找不到为什么一个大项目因此而停滞。我猜在做了很多实验之后,设置下一个节点行可能会有问题
下面是创建和填充表的查询
CREATE TABLE Station (
Station_ID INT,
Name VARCHAR(20),
Line_ID INT,
Prev_Station INT,
Next_Station INT,
Hybrid_ID INT,
PRIMARY KEY (Station_ID),
FOREIGN KEY (Line_ID) REFERENCES Line(Line_ID),
FOREIGN KEY (Hybrid_ID) REFERENCES Hybrid(Hybrid_ID)
);
ALTER TABLE Station ADD FOREIGN KEY (Prev_Station) REFERENCES Station(Station_ID);
ALTER TABLE Station ADD FOREIGN KEY (Next_Station) REFERENCES Station(Station_ID);
INSERT INTO Station VALUES
(1,'R1',1,NULL,2,NULL),
(2,'R2',1,1,3,NULL),
(3,'RG',1,-1,-1,1),
(4,'RY',1,-1,-1,2),
(5,'R3',1,4,6,NULL),
(6,'R4',1,5,NULL,NULL),
(7,'G1',3,NULL,8,NULL),
(8,'G2',3,7,3,NULL),
(9,'Y1',2,NULL,4,NULL),
(10,'Y2',2,4,11,NULL),
(11,'Y3',2,10,NULL,NULL);
SET nextNode=从站点ID=8的站点中选择下一个站点;可能会返回大量无法分配到单个变量的行。请使用递归CTE而不是递归迭代。使用提供的数据,即station中只有三个条目的数据,您的代码可以工作,除了将SET max移到delimeter之外。请提供足够的数据,以便我们可以重复此问题。@mr.loop。错误似乎很明显。但是,如果你想解决这个问题,你应该问一个新问题,包括样本数据、期望的结果,以及你想要完成的事情的清晰解释。你的触发器导致了这个问题,而这个问题并不需要堆栈比较。做了这个更改后,我现在在insertMain中得到了一个无限循环,但至少在stack_Compare中插入了预期的两个值。我把它留给你去弄清楚为什么你的循环没有中断!!!!