为什么我的子查询返回多行?

时间:2013-08-03 13:21:13

标签: sql subquery advantage-database-server

我正在使用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;

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

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

2 个答案:

答案 0 :(得分:1)

如果您使用subquery作为expression,则必须确保它不会返回多行。

这可以在subquery中通过:

完成
  • SELECT TOP 1
  • SELECT DISTINCT(不适用于所有情况)
  • GROUP BY(不适用于所有情况)
  • SELECT COUNT(*)
  • 在数据库上仔细构建WHERE条件和约束

subquery用作另一个查询的一部分时,您也可以将JOIN变为EXISTS,但如果操作不正确,这将导致主查询中有更多行。

在其他数据库中,还有NOT EXISTSANY或{{1}}条款来解决此问题。

答案 1 :(得分:0)

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

(SELECT CASE WHEN WithParent IS NULL THEN '' ELSE WithParent + '->' + Name END FROM __output WHERE AreaOutID=AID)