2011-05-16 20 views
5

Estoy intentando actualizar una columna en una tabla basada en otra columna en otra tabla.Actualizar tabla basada en otra tabla

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

p.id y e.faculty corresponden. Quiero actualizar el rango con p.desc si los ID son los mismos. (e.faculty y p.id)

¡Cualquier ayuda será genial! :)

+1

¿Qué RDBMS estás usando? –

Respuesta

15

probar este para SQL Server:

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

o si necesita un alias en la tabla base (por cualquier razón), es necesario hacer esto:

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

Batirme por segundos. – AllenG

+0

¿Hay alguna manera de usar esta sintaxis con un alias en la tabla actualizada? Por ejemplo, esto no es válido: 'UPDATE @Y SET Field = X.Field FROM @X AS X WHERE @ Y.Key = X.Key'. Normalmente usaría 'UPDATE Y SET Field = X.Field FROM @Y AS Y INNER JOIN @X AS X ON Y.Key = X.Key', pero eso es un poco más detallado. –

+0

@Jon of All Trades: vea mi respuesta actualizada –

1

Es necesario una restricción en forma de una cláusula WHERE; si usa EXISTS, puede basarlo en su subconsulta escalar, p.

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' 
      ); 

nota los objetivos por encima de la UPDATE en la tabla base eval en lugar del nombre de correlación e. Esto tiene mucho más sentido cuando se piensa en un SQL UPDATE en términos de asignación relacional, es decir, no desea asignar a e porque (a diferencia de la tabla base) saldrá del alcance.

Cuestiones relacionadas