Tengo una estructura de tabla simple como esta:
Tabla tempData
╔══════════╦═══════╗
║ NAME ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║ 80 ║
║ Ravi ║ 85 ║
║ Sanjay ║ 90 ║
╚══════════╩═══════╝
Y también tengo otros nombres de tablas como tempDataView como este
╔══════════╦═══════╗
║ NAME ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║ ║
║ Narendra ║ ║
║ Narendra ║ ║
║ Narendra ║ ║
║ Ravi ║ ║
║ Ravi ║ ║
║ Sanjay ║ ║
╚══════════╩═══════╝
Quiero actualizar la tabla tempDataView , estableciendo las Marcas de acuerdo con tempDataView - Nombre en comparación con tempData - Nombre
Sí, déjame mostrarte lo que intenté, intenté resolver esto usando el Cursor y se resolvió 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 una tarea para mí resolverlo usando la Subconsulta.
sql
sql-server
tsql
sql-update
Narendra Pal
fuente
fuente
subquery
, pero prefiero usarJOIN
queSUBQUERY
.INDEX
en lasmarks
columnas? ¿No debería estar en lasName
columnas?SELECT
aSELECT TOP 1
debido a que está aprendiendo, le sugiero que practique la conversión de uniones SELECT en UPDATE o DELETE joins. Primero le sugiero que genere una declaración SELECT uniendo estas dos tablas:
SELECT * FROM tempDataView a INNER JOIN tempData b ON a.Name = b.Name
Luego observe que tenemos dos alias de tabla
a
yb
. Con estos alias, puede generar fácilmente una instrucción UPDATE para actualizar la tabla a o b. Para la tabla a, tiene una respuesta proporcionada por JW. Si desea actualizarb
, la declaració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 declaración en una declaración DELETE, use el mismo enfoque. La siguiente declaración se eliminará
a
solo de (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 SQL Fiddle creado por JW como un patio de recreo
fuente
Aquí, en mi muestra, descubro la solución de esto, porque tuve el mismo problema con las actualizaciones y subquerías:
UPDATE A SET A.ValueToChange = B.NewValue FROM ( Select * From C ) B Where A.Id = B.Id
fuente
El título de este hilo pregunta cómo se puede utilizar una subconsulta en una actualización. He aquí 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
fuente
Aquí hay una buena explicación de la operación de actualización con algunos ejemplos. Aunque es un sitio de Postgres, las consultas SQL también son válidas para las otras bases de datos. Los siguientes ejemplos son intuitivos de comprender.
-- 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 generará un error si hay múltiples coincidencias de id. Además, si no hay ninguna coincidencia para una entrada de accounts.sales_id en particular, la primera consulta 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 la siguiente.
UPDATE tempDataView SET (marks) = (SELECT marks FROM tempData WHERE tempDataView.Name = tempData.Name);
fuente