为什么这些查询 return 不同?

Why do these queries return differently?

我正在处理一个查询,我正在更新一个用户定义的 table,它总是有 1 行(它是一个更大操作的一部分)。此 table 是通过根据员工 ID 从更大的员工 table 查询得到的。

此查询大部分时间都有效,但在某些情况下我得到

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

错误。

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 填充值,但只有 returning 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 行。

编辑 2:

我好像觉得自己在这件事上走投无路了!

return错误的原始查询是:

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 有一个 'Federal' 列,'performanceyear' 也是如此,当我查看这个执行计划时,它正在比较 'performanceyear'.Federal 和 'performanceyear' 。联邦。所以我将 @empInfo 联邦名称更改为 isFederal 并且它起作用了。

我的其他测试导致问题的原因不是因为@empinfo 中的 2 行。那是因为我在运行更新然后又更新了。第一次更新导致第二次更新 return 2 performanceyear 结果。

运行 他们独立工作。

话虽如此,我仍然不知道在列名称不同的情况下可以工作的解决方案,因为我不能在更新子查询中对@empInfo 使用别名。

我怀疑您在@empInfo 和 performanceyear 之间有一些重复的列名,因为您只是从一个 table 中选择数据,所以没有警告。如果您使用 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