为什么这些查询 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
我正在处理一个查询,我正在更新一个用户定义的 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