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.

Author: John Woo, 2013-01-31

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
        )
 110
Author: John Woo,
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

 23
Author: cha,
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
 0
Author: Graham Laight,
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);
 0
Author: Memin,
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