UPDATE con JOIN en SQLServer

Supongamos que queremos actualizar en nuestra bbdd SQLServer el campo de costes de la tabla de hechos FAC_TABLE con el coste unitario de nuestra tabla de COSTES.

UPDATE FAC_TABLE
SET COSTE_UNITARIO = ct.COSTE_UNITARIO
FROM COSTES ct
WHERE FAC_TABLE.id_articulo = ct.id_articulo

 

Algo más sencillo que en Oracle.

 

Espero que os ayude.

Héctor Minguet.

Reconozco que esta sentencia de UPDATE a partir de una SELECT de otra tabla en SQLServer es simple y efectiva pero, aunque no lo parezca, para mi es más fácil de recordar, y te diría que más comprensible esta otra sentencia SQL de Update, que yo calificaría de más estandar, y en la que se separa la condición de Join de los filtros del Where:

UPDATE Fact SET coste_unitario = ct.coste_unitario
FROM FAC_TABLE Fact INNER JOIN Costes ct ON Fact.id_articulo = ct.id_articulo
WHERE Fact.idfecha > 20120101

Alguien conoce alguna sentencia SQL mejor, o diferente, para hacer un 'UPDATE FROM SELECT' con SQL Server?

 

En respuesta a por Carlos

Holas

yo soy muy partidario, cuando se complica mucho la cosa, de los bloques cte (tambien para oracle), se ve muy claro todo:

;with fact_CTE as (
    SELECT fact.coste_unitario,
           ct.coste_unitario as coste_unitario_UPD
    FROM FAC_TABLE Fact 
         INNER JOIN Costes ct ON Fact.id_articulo= ct.id_articulo
    WHERE   Fact.idfecha > 20120101 )
UPDATE fact_CTE set  coste_unitario= coste_unitario_UPD

 

En respuesta a por Anonimo (no verificado)

Buena sugerencia. En estos ejemplos de Updates con join las sentencias son bastante simples, pero con queries más complejas la utilización de bloques CTE con el with de SQL Server puede simplificar muchísimo la comprensión de la sentencia, y a veces también el rendimiento.

 

 

Excelente post...me sirvió para solucionar un problemon (problema grande) en mi trabajo.

Gracias