En SQL Server , es posible INSERT
ingresar a una tabla usando una SELECT
declaración:
INSERT INTO Table (col1, col2, col3)
SELECT col1, col2, col3
FROM other_table
WHERE sql = 'cool'
¿También es posible actualizar a través de un SELECT
? Tengo una tabla temporal que contiene los valores y me gustaría actualizar otra tabla usando esos valores. Quizás algo como esto:
UPDATE Table SET col1, col2
SELECT col1, col2
FROM other_table
WHERE sql = 'cool'
WHERE Table.id = other_table.id
sql
sql-server
tsql
select
jamesmhaley
fuente
fuente
SET Table.other_table_id = @NewValue
), cambie la instrucción ON a algo comoON Table.id = @IdToEdit AND other_table.id = @NewValue
En SQL Server 2008 (o mejor), use
MERGE
Alternativamente:
fuente
MERGE
también se puede usar para registros de "inserción"; es decir,UPDATE
si existe registro coincidente,INSERT
nuevo registro si no se encontró coincidenciaUPDATE
queMERGE
, la gente simplemente han aprendido a vivir con ellos y se convierten en parte del paisaje ( 'características'). Tenga en cuenta que los blogs no existían cuandoUPDATE
era el nuevo chico de la cuadra.fuente
SET Table_A.col1 = SUM(Table_B.col1)
(o cualquier otra función de agregado). Tan mejor que la respuesta de Robin Day para este propósito.Modificaría la excelente respuesta de Robin a lo siguiente:
Sin una cláusula WHERE, afectará incluso las filas que no necesitan verse afectadas, lo que podría (posiblemente) causar recálculo del índice o disparar disparadores que realmente no deberían haberse disparado.
fuente
WHERE EXISTS(SELECT T1.Col1, T1.Col2 EXCEPT SELECT T2.Col1, T2.Col2))
Es más conciso.De una sola mano
fuente
Otra posibilidad que aún no se menciona es simplemente lanzar la
SELECT
declaración en un CTE y luego actualizar el CTE.Esto tiene el beneficio de que es fácil ejecutar la
SELECT
declaración por sí solo primero para verificar los resultados, pero requiere que alias las columnas como se indica arriba si se nombran de la misma manera en las tablas de origen y destino.Esto también tiene la misma limitación que la
UPDATE ... FROM
sintaxis patentada que se muestra en cuatro de las otras respuestas. Si la tabla de origen está en el lado múltiple de una unión uno a muchos, entonces no se puede determinar cuál de los posibles registros unidos coincidentes se utilizará enUpdate
(un problema que seMERGE
evita al generar un error si hay un intento de actualizar el misma fila más de una vez).fuente
CTE
?;WITH SomeCompexCTE AS (...), CTEAsAbove AS (SELECT T1.Col1,... FROM T1 JOIN SomeComplexCTE...) UPDATE CTEAsAbove SET Col1=_Col1, ...
Para el registro (y otros que buscan como yo), puede hacerlo en MySQL así:
fuente
Usando alias:
fuente
La forma simple de hacerlo es:
fuente
Esta puede ser una razón de nicho para realizar una actualización (por ejemplo, utilizada principalmente en un procedimiento), o puede ser obvio para otros, pero también debe indicarse que puede realizar una instrucción update-select sin usar join (en caso de que las tablas entre las que está actualizando no tienen un campo común).
fuente
Aquí hay otra sintaxis útil:
Comprueba si es nulo o no utilizando "WHERE EXIST".
fuente
Agrego esto solo para que pueda ver una forma rápida de escribirlo para que pueda verificar qué se actualizará antes de realizar la actualización.
fuente
Si usa MySQL en lugar de SQL Server, la sintaxis es:
fuente
ACTUALIZAR desde SELECT con INNER JOIN en la base de datos SQL
Dado que hay demasiadas respuestas a esta publicación, que son las que más se votaron, pensé que también daría mi sugerencia aquí. Aunque la pregunta es muy interesante, la he visto en muchos sitios de foros e hice una solución usando INNER JOIN con capturas de pantalla.
Al principio, creé una tabla llamada con schoolold e inserté algunos registros con respecto a los nombres de sus columnas y la ejecuté.
Luego ejecuté el comando SELECCIONAR para ver los registros insertados.
Luego creé una nueva tabla nombrada con schoolnew y ejecuté de manera similar las acciones anteriores en ella.
Luego, para ver los registros insertados, ejecuto el comando SELECCIONAR.
Ahora, aquí quiero hacer algunos cambios en la tercera y cuarta fila, para completar esta acción, ejecuto el comando ACTUALIZAR con INNER JOIN .
Para ver los cambios ejecuto el comando SELECCIONAR .
Puede ver cómo los registros tercero y cuarto de tableoldold reemplazan fácilmente con table schoolnew usando INNER JOIN con la declaración UPDATE.
fuente
Y si desea unirse a la tabla consigo mismo (lo que no sucederá con demasiada frecuencia):
fuente
targett1
y ensourcet1
lugar de (o tan bien) comentarios.El siguiente ejemplo utiliza una tabla derivada, una instrucción SELECT después de la cláusula FROM, para devolver los valores antiguos y nuevos para futuras actualizaciones:
fuente
La actualización
CTE
es más legible que las otras respuestas aquí:fuente
Si está utilizando SQL Server, puede actualizar una tabla de otra sin especificar una unión y simplemente vincular las dos desde la
where
cláusula. Esto hace una consulta SQL mucho más simple:fuente
Consolidando todos los diferentes enfoques aquí.
La estructura de la tabla de muestra se encuentra a continuación y se actualizará de Product_BAK a la tabla de productos.
Producto
Product_BAK
1. Seleccione actualizar
2. Actualice con una expresión de tabla común
3. Fusionar
En esta declaración de combinación, podemos insertar si no encuentra un registro coincidente en el destino, pero existe en la fuente y busque la sintaxis:
fuente
La otra forma es usar una tabla derivada:
Data de muestra
fuente
Para asegurarse de que está actualizando lo que desea, seleccione primero
fuente
Incluso hay un método más corto y puede ser sorprendente para usted:
Conjunto de datos de muestra:
Código:
fuente
Utilizar:
YA SEA:
O:
Si el nombre de la columna ID es el mismo en ambas tablas, simplemente coloque el nombre de la tabla antes de la tabla que se va a actualizar y use un alias para la tabla seleccionada, es decir:
fuente
En la respuesta aceptada, después de:
Yo podria agregar:
Lo que generalmente hago es poner todo en una transacción respaldada por roll y usar el
"OUTPUT"
: de esta manera veo todo lo que está por suceder. Cuando estoy feliz con lo que veo, puedo cambiar elROLLBACK
alCOMMIT
.Por lo general, necesito documentar lo que hice, así que uso la
"results to Text"
opción cuando ejecuto la consulta de respaldo y guardo tanto el script como el resultado de la SALIDA. (Por supuesto, esto no es práctico si cambié demasiadas filas)fuente
fuente
La siguiente solución funciona para una base de datos MySQL:
fuente
La otra forma de actualizar desde una instrucción select:
fuente
Opción 1: Uso de la unión interna:
Opción 2: Subconsulta relacionada con Co
fuente
La sintaxis para la instrucción UPDATE al actualizar una tabla con datos de otra tabla en SQL Server
fuente
Puede usar esto para actualizar en el servidor sql
fuente