Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 无法解释的“子查询返回超过1行”错误_Mysql_Sql_Subquery - Fatal编程技术网

Mysql 无法解释的“子查询返回超过1行”错误

Mysql 无法解释的“子查询返回超过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)

下面是一系列非常简单的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);
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中插入了预期的两个值。我把它留给你去弄清楚为什么你的循环没有中断!!!!