Pregunta ¿Cómo puedo hacer una instrucción UPDATE con JOIN en SQL?


Necesito actualizar esta tabla en SQL Server 2005 con los datos de su tabla 'padre', ver a continuación:

venta

id (int)
udid (int)
assid (int)

ud

id  (int)
assid  (int)

sale.assid contiene el valor correcto para actualizar ud.assid.

¿Qué consulta hará esto? Estoy pensando en join pero no estoy seguro de si es posible.


1022
2017-08-18 11:40


origen


Respuestas:


La sintaxis depende estrictamente de qué SQL DBMS estás usando. Aquí hay algunas maneras de hacerlo en ANSI / ISO (también debería funcionar en cualquier SQL DBMS), MySQL, SQL Server y Oracle. Tenga en cuenta que mi método ANSI / ISO sugerido suele ser mucho más lento que los otros dos métodos, pero si está utilizando un DBMS SQL distinto de MySQL, SQL Server u Oracle, entonces puede ser el único camino a seguir (por ejemplo, si su SQL DBMS no es compatible MERGE)

ANSI / ISO:

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where exists (
      select * 
      from sale 
      where sale.udid = ud.id
 );

MySQL:

update ud u
inner join sale s on
    u.id = s.udid
set u.assid = s.assid

Servidor SQL:

update u
set u.assid = s.assid
from ud u
    inner join sale s on
        u.id = s.udid

Oráculo:

update
    (select
        u.assid as new_assid,
        s.assid as old_assid
    from ud u
        inner join sale s on
            u.id = s.udid) up
set up.new_assid = up.old_assid

SQLite:

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where RowID in (
      select RowID 
      from ud 
      where sale.udid = ud.id
 );

1925
2017-08-18 11:44



Esto debería funcionar en SQL Server:

update ud 
set assid = sale.assid
from sale
where sale.udid = id

110
2017-08-18 11:42



postgres

UPDATE table1
SET    COLUMN = value
FROM   table2,
       table3
WHERE  table1.column_id = table2.id
       AND table1.column_id = table3.id
       AND table1.COLUMN = value
       AND table2.COLUMN = value
       AND table3.COLUMN = value 

82
2018-01-17 13:53



Un enfoque SQL estándar sería

UPDATE ud
SET assid = (SELECT assid FROM sale s WHERE ud.id=s.id)

En SQL Server puedes usar un join

UPDATE ud
SET assid = s.assid
FROM ud u
JOIN sale s ON u.id=s.id

39
2017-08-18 11:44



PostgreSQL:

CREATE TABLE ud (id integer, assid integer);
CREATE TABLE sales (id integer, udid integer, assid integer);

UPDATE ud
SET assid = sales.assid
FROM sales
WHERE sales.id = ud.id;

27
2018-03-07 21:35



Consulta de actualización simplificada usando UNIRSE-ing múltiples tablas.

   UPDATE
        first_table ft
        JOIN second_table st ON st.some_id = ft.some_id
        JOIN third_table tt  ON tt.some_id = st.some_id
        .....
    SET
        ft.some_column = some_value
    WHERE ft.some_column = 123456 AND st.some_column = 123456

Nota - first_table, second_table, third_table y some_column como 123456 son nombres de tablas de demostración, nombres de columnas e identificadores. Reemplácelos con los nombres válidos.


18
2017-07-14 07:15



Otro ejemplo de por qué SQL no es realmente portátil.

Para MySQL sería:

update ud, sale
set ud.assid = sale.assid
where sale.udid = ud.id;

Para obtener más información, lea la actualización de varias tablas: http://dev.mysql.com/doc/refman/5.0/en/update.html

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
    [WHERE where_condition]

12
2017-11-16 19:17



Teradata Aster ofrece otra forma interesante de cómo lograr el objetivo:

MERGE INTO ud --what trable should be updated
USING sale -- from what table/relation update info should be taken
ON ud.id = sale.udid --join condition
WHEN MATCHED THEN 
    UPDATE SET ud.assid = sale.assid; -- how to update

8
2017-07-03 10:22



Estaba pensando que el SQL-Server uno en la publicación superior funcionaría para Sybase ya que ambos son T-SQL pero desafortunadamente no.

Para Sybase, encontré que la actualización debe estar sobre la mesa, no el alias:

update ud
set u.assid = s.assid
from ud u
    inner join sale s on
        u.id = s.udid

7
2017-11-19 08:24



La siguiente declaración con la palabra clave FROM se usa para actualizar varias filas con una combinación

UPDATE users 
set users.DivisionId=divisions.DivisionId
from divisions join users on divisions.Name=users.Division

5
2018-04-06 11:34



UPDATE tblAppraisalBasicData
SET tblAppraisalBasicData.ISCbo=1
FROM tblAppraisalBasicData SI INNER JOIN  aaa_test RAN ON SI.EmpID = RAN.ID

1
2017-12-19 11:38