根据另一张表更新表格

10

我正在尝试根据另一个表中的另一列更新表中的一列。

UPDATE eval e
   SET rank = (SELECT p.desc
                 FROM Position p
                WHERE p.id = e.faculty 
                  AND p.date >= '2011-05-20'
              )

p.ide.faculty 是对应的。如果它们的id相同,我想用p.desc来更新rank。(针对e.facultyp.id

非常感谢你的帮助! :)

2个回答

22

尝试在 SQL Server 中使用以下代码:

UPDATE dbo.eval 
SET rank = p.desc
FROM dbo.Position p
WHERE p.id = eval.faculty and p.date >= '2011-05-20'

或者如果你需要在基础表上使用别名(出于任何原因),你需要执行以下操作:

UPDATE dbo.eval 
SET rank = p.desc
FROM dbo.eval e
INNER JOIN dbo.Position p ON p.id = e.faculty 
WHERE p.date >= '2011-05-20'

有没有办法在更新的表上使用别名来使用这个语法?例如,这是无效的:UPDATE @Y SET Field = X.Field FROM @X AS X WHERE @Y.Key = X.Key。我通常会使用UPDATE Y SET Field = X.Field FROM @Y AS Y INNER JOIN @X AS X ON Y.Key = X.Key,但那有点啰嗦。 - user565869
这对于Postgresql也应该适用,作为非标准扩展。 - Andrew Lazarus
尝试运行以下查询,但无法运行。“#1064-您的SQL语法中有一个错误;请检查与您的MySQL服务器版本相对应的手册,以了解在第1行使用的正确语法'FROM banks_info b inner join bank_states s on s.name = b.state” 有什么建议吗? 更新banks_info设置状态= s.guid FROM banks_info b内部联接bank_states s ON s.name = b.state - Chetan Sharma
1
我更喜欢第二个查询,因为你只需用UPDATE替换SELECT,所以出错的可能性更小,大多数人默认使用JOIN,因此您不需要为了更新而将其重写为旧的连接。 - Muflix

2

你需要在WHERE子句中加入限制条件;如果使用EXISTS,可以基于标量子查询来设置。

UPDATE eval
   SET rank = (
               SELECT p.desc
                 FROM Position p
                WHERE p.id = eval.faculty 
                      AND p.date >= '2011-05-20'
              )
 WHERE EXISTS (
               SELECT *
                 FROM Position p
                WHERE p.id = eval.faculty 
                      AND p.date >= '2011-05-20'
              );

请注意,上面的语句针对的是基础表eval上的UPDATE而不是关联名称e。 从关系赋值的角度来看,当您考虑SQL UPDATE时,这更有意义,也就是说,您不希望分配给e,因为它(与基础表不同)将超出范围!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接