在 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
)
希望对以后的观众有所帮助。
问候橡树
我被困在这个查询上:我想更新临时 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
)
希望对以后的观众有所帮助。
问候橡树