两个不同的更新语句 - 只有一个工作

时间:2015-10-28 08:59:35

标签: sql sql-server tsql sql-server-2012

对于存储过程,我有两种不同的update语句变体。最上面一个不起作用,底部起作用。

你们中的任何人都可以提供有关它为什么没有的见解吗?

UPDATE table1
SET outcome = (
    SELECT outcome
    FROM table2
    WHERE table1.StatusID = table2.StatusID
    AND table1.IDUser = table2.UserID
)

下面的一个有效,即使我有完全相同的约束。

UPDATE a
SET a.outcome = b.outcome
FROM table1 A
INNER JOIN table2 B ON A.IDUser = B.UserID AND A.StatusID = B.StatusID

3 个答案:

答案 0 :(得分:3)

table2 中有更多行与匹配项匹配时,第一次更新将失败。第二次更新将从联接中选择结果的任意值,并在更新中使用该值。

对第一次更新的此更改应该有效,或者更确切地说给出相同的结果:

UPDATE table1
SET outcome = (
    SELECT TOP 1 outcome
    FROM table2
    WHERE table1.StatusID = table2.StatusID
    AND table1.IDUser = table2.UserID
)

也许这会比您现有的更新更好。通过这种方式,您可以控制哪些值最终会出现在 table1 中的结果中:

UPDATE table1
SET outcome = (
    SELECT MAX(outcome)
    FROM table2
    WHERE table1.StatusID = table2.StatusID
    AND table1.IDUser = table2.UserID
)

答案 1 :(得分:1)

第一个查询无法正常工作,这是正常的,因为它是一个错误的查询。

您的第一个代码有一个主查询和一个子查询。 在子查询中,您可以连接表并获取结果集。 但是在主查询中,您使用子查询返回的结果设置每一行,因为您没有where块。该结果集中应该有一个空值。这就是您在更新后出现空值的原因。

您必须加入子查询,就像在第二个代码中一样。

答案 2 :(得分:-1)

UPDATE table1
SET outcome = (
    SELECT TOP(1)outcome
    FROM table2
    WHERE table2.StatusID = table1.StatusID
    AND table2.IDUser = table1.IDUser
)