Actualizar consulta usando subconsulta en Sql Server
Perfectamente, pero estoy encontrando la manera de resolverlo usando la subconsulta
Aquí está:
Declare @name varchar(50),@marks varchar(50)
Declare @cursorInsert CURSOR
set @cursorInsert = CURSOR FOR
Select name,marks from tempData
OPEN @cursorInsert
FETCH NEXT FROM @cursorInsert
into @name,@marks
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE tempDataView set marks = @marks where name = @name
FETCH NEXT FROM @cursorInsert
INTO @name,@marks
END
CLOSE @cursorInsert
DEALLOCATE @cursorInsert
En realidad es como la tarea para mí resolverlo usando la subconsulta.
4 answers
Puede unir ambas tablas incluso en UPDATE
declaraciones,
UPDATE a
SET a.marks = b.marks
FROM tempDataView a
INNER JOIN tempData b
ON a.Name = b.Name
Para un rendimiento más rápido, defina un INDEX
en la columna marks
en ambas tablas.
Usando SUBQUERY
UPDATE tempDataView
SET marks =
(
SELECT marks
FROM tempData b
WHERE tempDataView.Name = b.Name
)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-31 04:57:13
Debido a que está aprendiendo, le sugiero que practique la conversión de un SELECT joins para ACTUALIZAR o ELIMINAR joins. Primero te sugiero que generes una sentencia SELECT uniendo estas dos tablas:
SELECT *
FROM tempDataView a
INNER JOIN tempData b
ON a.Name = b.Name
Luego tenga en cuenta que tenemos dos alias de tabla a
y b
. Usando estos alias puede generar fácilmente la instrucción UPDATE para actualizar la tabla a o b. Para la tabla a tiene una respuesta proporcionada por JW. Si desea actualizar b
, la instrucción será:
UPDATE b
SET b.marks = a.marks
FROM tempDataView a
INNER JOIN tempData b
ON a.Name = b.Name
Ahora, para convertir la sentencia a una sentencia DELETE utilice el mismo enfoque. La siguiente declaración eliminará de a
solo (dejando b intacto) para aquellos registros que coincidan por nombre:
DELETE a
FROM tempDataView a
INNER JOIN tempData b
ON a.Name = b.Name
Puede usar el violín SQL creado por JW como patio de recreo
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-31 05:00:12
El título de este hilo pregunta cómo se puede usar una subconsulta en una actualización. Aquí hay un ejemplo de eso:
update [dbName].[dbo].[MyTable]
set MyColumn = 1
where
(
select count(*)
from [dbName].[dbo].[MyTable] mt2
where
mt2.ID > [dbName].[dbo].[MyTable].ID
and mt2.Category = [dbName].[dbo].[MyTable].Category
) > 0
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-21 10:21:44
Aquí es una buena explicación de la operación de actualización con algunos ejemplos. Aunque es el sitio de Postgres, pero las consultas SQL son válidas para los otros DBs, también. Los siguientes ejemplos son intuitivos de entender.
-- Update contact names in an accounts table to match the currently assigned salesmen:
UPDATE accounts SET (contact_first_name, contact_last_name) =
(SELECT first_name, last_name FROM salesmen
WHERE salesmen.id = accounts.sales_id);
-- A similar result could be accomplished with a join:
UPDATE accounts SET contact_first_name = first_name,
contact_last_name = last_name
FROM salesmen WHERE salesmen.id = accounts.sales_id;
Sin embargo, la segunda consulta puede dar resultados inesperados si salesmen.id no es una clave única, mientras que se garantiza que la primera consulta genere un error si hay varias coincidencias de id. Además, si no hay coincidencia para una cuenta en particular.entrada sales_id, la primera query establecerá los campos de nombre correspondientes en NULL, mientras que la segunda consulta no actualizará esa fila en absoluto.
Por lo tanto, para el ejemplo dado, la consulta más confiable es como la siguiente.
UPDATE tempDataView SET (marks) =
(SELECT marks FROM tempData
WHERE tempDataView.Name = tempData.Name);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-03 16:04:54