我正在处理一个查询,我正在更新一个总是有1行的用户定义表(它是一个更大的操作的一部分)。通过根据员工ID从较大的员工表中查询来填充此表。
此查询大部分时间都在运行,但在某些情况下我得到了
'子查询返回的值超过1。这是不允许的 子查询跟随=,!=,<,< =,>,> =或当子查询用作 一个表达。'
错误。
UPDATE @empInfo SET lastpromotiondate = ISNULL((
SELECT begindate
FROM performanceyear
WHERE lastpromotiondate BETWEEN
begindate AND enddate AND performanceyear.[fk_function_id] =
functionid AND isfederal =
performanceyear.federal), lastpromotiondate)
我无法准确找出原因,我尝试使用select填充值,但只返回1个结果。
我很茫然,所以我在下面尝试过它。
UPDATE @empInfo SET LastPromotionDate = ISNULL((
SELECT begindate
FROM performanceyear
WHERE (SELECT LastPromotionDate FROM @empinfo) BETWEEN begindate AND enddate
AND [FK_Function_ID] = (SELECT FunctionID FROM @empinfo)
AND Federal = (SELECT isFederal FROM @empinfo)
), LastPromotionDate)
他们肯定不会执行相同的操作,但我觉得我在这里遗漏了一些东西。为什么一个工作而另一个工作? @empInfo只有1行。
Edit2:
我似乎已经把自己想到了这个角落!
返回错误的ORIGINAL查询是:
UPDATE @empInfo SET LastPromotionDate =
ISNULL((
SELECT begindate
FROM performanceyear
WHERE LastPromotionDate BETWEEN begindate AND enddate
AND performanceyear.[FK_Function_ID] = FunctionID
AND Federal = performanceyear.Federal)
,LastPromotionDate)
@empInfo有一个联邦'专栏' performanceyear'当我查看这个的执行计划时,它正在将性能年份与联邦的表现进行比较。联邦。所以我改变了@empInfo联邦名字,它是联邦的,但它确实有效。
我的其他测试导致问题的原因不是因为@empinfo中有2行。这是因为我正在运行更新,然后再次更新。第一次更新导致第二次更新从performanceyear返回2个结果。
独立运行他们的工作。
有了这一切,我仍然不知道一个解决方案,如果没有列不同的名称就行,因为我不能在更新子查询中使用@empInfo上的别名。
答案 0 :(得分:0)
我怀疑你在@empInfo和performanceyear之间有一些重复的列名,因为你只是从一个表中选择数据,所以没有警告。如果您使用tablename.columnname,则可以修复第一个查询。
我会按如下方式重写您的查询(未经测试)
UPDATE ei
SET LastPromotionDate = ISNULL(py.begindate, py.LastPromotionDate)
FROM performanceyear py
INNER JOIN @empInfo ei
ON ei.LastPromotionDate BETWEEN py.begindate AND py.enddate
AND ei.FunctionID = py.[FK_Function_ID]
AND ei.isFederal = py.Federal