1

我正在使用 Advantage 数据库服务器。

我有一张表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;

我收到有关返回多行的子查询的错误。

是什么导致它以及如何解决它?

4

2 回答 2

1

如果您使用 asubquery作为 an expression,则必须确保它返回的行数不超过一行。

这可以通过以下方式完成subquery

  • SELECT TOP 1
  • SELECT DISTINCT(不适用于所有情况)
  • GROUP BY(不适用于所有情况)
  • SELECT COUNT(*)
  • 数据库上精心构建WHERE的条件和约束

当它被用作另一个查询的一部分时,您也可以将其subquery转换为 a JOIN,但如果没有正确完成,这将导致主查询中的更多行。

在其他数据库中也有EXISTSand NOT EXISTSorANY子句来解决这个问题。

于 2013-10-26T11:45:13.453 回答
0

在没有看到数据并看到所有其他子查询都包含 TOP 1 的情况下,我认为以下子查询必须返回 >1 行:

(SELECT CASE WHEN WithParent IS NULL THEN '' ELSE WithParent + '->' + Name END FROM __output WHERE AreaOutID=AID)
于 2014-04-10T13:07:15.443 回答