我正在使用Advantage Database Server。
我有一个表Areas
,我想查找父区域的所有子节点。
表名和列名是:
Areas
(
AreaID INTEGER
, Name NVARCHAR(50)
, Code NVARCHAR(50)
)
存储过程是:
CREATE PROCEDURE GetAreaLocations
(
AreaID INTEGER
, AreaOutID INTEGER OUTPUT
, AreaName NVARCHAR(100) OUTPUT
, AreaCode NVARCHAR(50) OUTPUT
, WithParent NVARCHAR(100) OUTPUT
, DepthSpace NVARCHAR(50) OUTPUT
, Depth INTEGER OUTPUT
, ParentID INTEGER OUTPUT
)
BEGIN
DECLARE
AID INTEGER
, depthid INTEGER
, tempdepth INTEGER
, depthspaceid NVARCHAR(50)
;
AID = (SELECT AreaID FROM __input);
depthid = 1;
depthspaceid = '';
INSERT INTO
__output
SELECT TOP 50
A.AreaID
, A.Name
, A.Code
, (SELECT Name + '->' + A.Name FROM Areas WHERE AreaID = A.ParentID)
, depthspaceid
, depthid
, AID
FROM
Areas A
WHERE
A.ParentID = AID
ORDER BY
A.AreaID ASC
;
IF (SELECT COUNT(AreaOutID) FROM __output) > 0 THEN
SELECT TOP 1
AID = AreaOutID
, depthid = Depth
FROM
__output
WHERE
ParentID = AID
ORDER BY
AreaOutID ASC
;
WHILE depthid > 0 DO
WHILE AID > 0 DO
INSERT INTO
__output
SELECT
AreaID
, Name
, Code
, Name
, (SELECT CASE WHEN WithParent IS NULL THEN '' ELSE WithParent + '->' + Name END FROM __output WHERE AreaOutID=AID)
, depthspaceid
, depthid + 1
, AID
FROM
Areas
WHERE
ParentID = AID
;
AID = ISNULL((SELECT TOP 1 AreaOutID FROM __output WHERE Depth=depthid and AreaOutID > AID ORDER BY AreaOutID ASC),0);
END WHILE;
tempdepth = depthid;
AID = 0;
depthid = 0;
SELECT TOP 1
depthid = Depth
, AID = AreaOutID
FROM
__output
WHERE
depthid > tempdepth
ORDER BY
depthid ASC
, AreaOutID ASC
;
WND WHILE;
END IF;
END;
我收到有关返回多行的子查询的错误。
是什么导致了它以及如何解决它?
答案 0 :(得分:1)
如果您使用subquery
作为expression
,则必须确保它不会返回多行。
这可以在subquery
中通过:
SELECT TOP 1
SELECT DISTINCT
(不适用于所有情况)GROUP BY
(不适用于所有情况)SELECT COUNT(*)
WHERE
条件和约束当subquery
用作另一个查询的一部分时,您也可以将JOIN
变为EXISTS
,但如果操作不正确,这将导致主查询中有更多行。
在其他数据库中,还有NOT EXISTS
和ANY
或{{1}}条款来解决此问题。
答案 1 :(得分:0)
在没有看到数据并且看到所有其他子查询都包含TOP 1的情况下,我认为以下子查询必须返回> 1行:
(SELECT CASE WHEN WithParent IS NULL THEN '' ELSE WithParent + '->' + Name END FROM __output WHERE AreaOutID=AID)