在 ParentItems 中更新 PossibleParentItem

UPDATE WHERE PossibleParentItem IN ParentItems

我被困在这个查询上:我想更新临时 table #tmpHierarchy 中的每一行并设置 pLevel = 3,如果该行尚未设置级别 (= 99) 并且其中之一它的 [可能] 父项包含在临时 table 中并且级别 = 2.

Table items 包含所有项目,table 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
               )
           )

这将是我想要实现的目标,但它 returns

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 子句 (?) 中有一个以上的值。

我很乐意就这个问题得到一些建议。

此致,

橡木

我很确定问题出在查询的那一部分:

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

它 return 多于一行,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 ) );

如果使用 IN,左子查询必须是 "one row" 结果,试试这个:

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 中正确加入解决。

好的,所以将第二个条件修改为 INNER JOIN 似乎给出了正确的结果:

              AND EXISTS (
                         SELECT ParItem.ID
                         FROM Items as IT
                         LEFT JOIN ParentItems as PTS ON PTS.ItemID = IT.ID 
                         LEFT JOIN Items as ParItem on ParItem.ID = PTS.ParentItemID
                         INNER JOIN #tmpHierarchy as H ON H.ItemID = ParItem.ID 
                         WHERE IT.ItemID = HI.PartNo AND H.pLevel = 2
                         )

希望对以后的观众有所帮助。

问候橡树