varios update una tablas tabla simultaneamente registros partir otra misma datos consulta actualizar sql sql-server tsql sql-server-2005 sql-update

una - update select sql server 2014



¿Cómo puedo hacer una instrucción UPDATE con JOIN en SQL? (14)

Necesito actualizar esta tabla en SQL Server 2005 con datos de su tabla "principal", vea 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.


MySQL

Obtendrá el mejor rendimiento si olvida la cláusula where y coloca todas las condiciones en la expresión ON.

Creo que esto se debe a que la consulta primero tiene que unirse a las tablas y luego ejecuta la cláusula where en eso, por lo que si puede reducir lo que se requiere para unirse, esa es la forma más rápida de obtener los resultados / hacer la actualización.

Ejemplo

Guión

Tienes una tabla de usuarios. Pueden iniciar sesión con su nombre de usuario o correo electrónico o número de cuenta. Estas cuentas pueden ser activas (1) o inactivas (0). Esta tabla tiene 50000 filas.

Luego tienes una tabla de usuarios para deshabilitar de una sola vez porque descubres que todos han hecho algo malo. Sin embargo, esta tabla tiene una columna con nombres de usuario, correos electrónicos y números de cuenta combinados. También tiene un indicador "has_run" que debe establecerse en 1 (verdadero) cuando se ha ejecutado

Consulta

UPDATE users User INNER JOIN blacklist_users BlacklistUser ON ( User.username = BlacklistUser.account_ref OR User.email = BlacklistedUser.account_ref OR User.phone_number = BlacklistUser.account_ref AND User.is_active = 1 AND BlacklistUser.has_run = 0 ) SET User.is_active = 0, BlacklistUser.has_run = 1;

Razonamiento

Si tuviéramos que unirnos solo en las condiciones OR, esencialmente tendríamos que revisar cada fila 4 veces para ver si debería unirse, y potencialmente devolver muchas más filas. Sin embargo, al darle más condiciones, puede "saltar" muchas filas si no cumplen todas las condiciones al unirse.

Prima

Es más legible. Todas las condiciones están en un solo lugar y las filas para actualizar están en un solo lugar


Consulta de actualización simplificada utilizando tablas múltiples de JOIN .

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.


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 en la tabla, no en el alias:

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


Esto debería funcionar en SQL Server:

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


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

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


La sintaxis depende estrictamente de qué DBMS SQL está utilizando. Aquí hay algunas formas de hacerlo en ANSI / ISO (también debería funcionar en cualquier DBMS de SQL), MySQL, SQL Server y Oracle. Tenga en cuenta que mi método ANSI / ISO sugerido normalmente será mucho más lento que los otros dos métodos, pero si está utilizando un DBMS de SQL diferente a MySQL, SQL Server u Oracle, entonces puede ser la única manera de hacerlo (por ejemplo, Si su DBMS SQL no soporta 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 );


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]


Para SQLite use la propiedad RowID para realizar la actualización:

update Table set column = ''NewValue'' where RowID = (select t1.RowID from Table t1 join Table2 t2 on t1.JoinField = t2.JoinField where t2.SelectValue = ''FooMyBarPlease'');


Teradata Aster ofrece otra forma interesante de 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


Un enfoque estándar de SQL sería

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

En SQL Server puede utilizar una unión

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


Y en MS ACCESS:

UPDATE ud INNER JOIN sale ON ud.id = sale.udid SET ud.assid = sale.assid;


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


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;


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