2011-05-16 267 views
5

我想基于另一个表中的另一列更新表中的一列。基于另一个表的更新表

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。 (e.facultyp.id

任何帮助将是伟大的! :)

+1

您使用的是什么RDBMS? – 2011-05-16 21:01:11

回答

15

试试这个为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' 
+0

以秒为单位打败我。 – AllenG 2011-05-16 21:03:30

+0

有没有办法在更新的表上使用这个语法和别名?例如,这是无效的:'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',但这有点冗长。 – 2011-05-16 21:18:36

+0

@所有交易:请参阅我的更新回复 – 2011-05-16 21:19:53

1

您需要限制条款的形式为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,而不是相关名eUPDATE。当从关系分配的角度考虑SQL UPDATE时,这会更有意义,也就是说,您不想分配给e,因为它(不像基表)将超出范围!

相关问题