0

私はこのクエリに行き詰まっています: 一時テーブル #tmpHierarchy の各行を更新し、pLevel = 3 を設定したいのですが、行にまだレベルが設定されておらず (= 99)、その [可能な] 親アイテムの 1 つが含まれている場合一時テーブルであり、レベル = 2 です。

テーブル items にはすべてのアイテムが含まれ、テーブル ParentItems にはアイテム間のリンクが含まれます (フィールド Item、ParentItem)

何かのようなもの:

UPDATE #tmpHierarchy SET pLevel = 3 WHERE pLevel = 99 
      AND (
               (
               SELECT Item FROM Items as IT LEFT JOIN ParentItems as PTS ON PTS.ItemID = IT.ID 
                             WHERE IT.ID = #tmpHierarchy.ItemID
                ) 
           IN
               (
               SELECT Item FROM #tmpHierarchy WHERE pLevel = 2
               )
           )

これは私が達成したいことですが、返されます

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.

...明らかな理由で、IN 句 (?) に複数の値があります。

この問題に対するいくつかの提案をいただければ幸いです。

よろしく、

オーク

4

3 に答える 3

1

問題はクエリのその部分にあると確信しています:

SELECT Item FROM Items as IT LEFT JOIN ParentItems as PTS ON PTS.ItemID = IT.ID 
                         WHERE IT.ID = #tmpHierarchy.ItemID

複数の行が返され、多対多の比較が IN 句で許可されていません。

クエリを次のように変更できます。

UPDATE  #tmpHierarchy
SET     pLevel = 3
WHERE   pLevel = 99
        AND EXISTS ( SELECT Item
                     FROM   Items AS IT
                            LEFT JOIN ParentItems AS PTS ON PTS.ItemID = IT.ID
                     WHERE  IT.ID = #tmpHierarchy.ItemID
                            AND Item IN ( SELECT    Item
                                          FROM      #tmpHierarchy
                                          WHERE     pLevel = 2 ) );
于 2015-10-07T17:34:07.240 に答える
1

IN を使用する場合、左側のサブクエリは「1 行」の結果でなければなりません。これを試してください。

UPDATE #tmpHierarchy SET pLevel = 3 WHERE pLevel = 99 
      AND (
            SELECT Item 
            FROM ParentItems as PTS WHERE PTS.ItemID = #tmpHierarchy.ItemID AND
                   #tmpHierarchy.pLevel = 2
           ) IS NOT NULL

アイテムはParentItemsのものだと思います。

これはこのサイトでの私の最初のコメントです。ヒントや苦情はお気軽にどうぞ。

編集: SELECT ... pLevel = 99 ... (#tmpHierarchy.pLevel = 2 は不可能) であるため、EXISTS に適切な結合を持つ所有者によって解決されました。

于 2015-10-07T17:52:04.823 に答える