为什么这些查询的回复方式不同

时间:2015-04-28 12:56:12

标签: sql sql-server sql-update subquery isnull

我正在处理一个查询,我正在更新一个总是有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上的别名。

1 个答案:

答案 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