Sql 为什么这些查询返回的结果不同?

Sql 为什么这些查询返回的结果不同?,sql,sql-server,sql-update,subquery,isnull,Sql,Sql Server,Sql Update,Subquery,Isnull,我正在处理一个查询,我正在更新一个总是有一行的用户定义表,这是一个更大操作的一部分。此表通过基于员工ID从较大的员工表中查询来填充 这个查询大部分时间都在运行,但在某些情况下,我会得到一个 '子查询返回了多个值。这是不允许的,因为 子查询后面是=,!=,=或者当子查询用作 一种表情。” 错误 UPDATE @empInfo SET lastpromotiondate = ISNULL(( SELECT begindate FROM performanceyear WHERE lastpromot

我正在处理一个查询,我正在更新一个总是有一行的用户定义表,这是一个更大操作的一部分。此表通过基于员工ID从较大的员工表中查询来填充

这个查询大部分时间都在运行,但在某些情况下,我会得到一个

'子查询返回了多个值。这是不允许的,因为 子查询后面是=,!=,=或者当子查询用作 一种表情。”

错误

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只有一行

编辑2:

我似乎觉得自己在这件事上陷入了困境

返回错误的原始查询是:

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”也是。当我查看这一专栏的执行计划时,它将“performanceyear.”联邦与“performanceyear.”联邦进行了比较。因此,我更改了@empInfo联邦名称,它是联邦的,并且成功了

我的另一个测试导致问题的原因不是因为@empinfo中有两行。这是因为我在运行更新,然后再次更新。第一次更新导致第二次更新从performanceyear返回2个结果

独立运行,他们工作


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

我怀疑@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

添加了回车符,希望能清理查询。好多了,谢谢。错误看起来很清楚。其中一个子查询返回的值超过1个,因此无法将列与单个值进行比较。你确定@empinfo只有一行吗?错误表明不是这样。我100%确定只有一行,在更新之前我用select仔细检查了一下,它显示了一行数据。可能有一些INSERT触发器引发了异常?就在我写更新的时候,这就是问题所在,我在这两行中有两次遇到联邦。