1

アドバンテージ データベース サーバーを使用しています。

私は 1 つのテーブルを持っており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

subqueryaを an として使用する場合はexpression、複数の行が返されないようにする必要があります。

これは、次の方法で実行できますsubquery

  • SELECT TOP 1
  • SELECT DISTINCT(すべての場合に有効というわけではありません)
  • GROUP BY(すべての場合に有効というわけではありません)
  • SELECT COUNT(*)
  • データベース上の慎重に構築されWHEREた条件と制約

subqueryを別のクエリの一部として使用するときに を に変換することもでき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 に答える