对于存储过程,我有两种不同的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
答案 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
)