2009-07-29 23 views
303

Quiero actualizar las 100 mejores registros en SQL Server. Tengo una tabla con los campos T1F1 y F2. T1 tiene 200 registros. Quiero actualizar el campo F1 en los 100 registros principales. ¿Cómo puedo actualizar basado en TOP 100 en SQL Server?cómo puedo actualizaciones Top 100 registros en el servidor SQL

+0

Este enlace puede ayudarlo http://www.codefari.com/2015/10/how-can-i-update-top-10-records-in-sql.html – Singh

Respuesta

522

Nota, se requieren los paréntesis para UPDATE:

update top (100) table1 set field1 = 1 
+16

Cualquier idea de cómo utilizar el 'orden por' también? –

+4

@JoePhilllips Utilice la respuesta Martin Smith por fin por – jjxtra

+0

Sin embargo, estos no son los 100 mejores discos, sino simplemente 100 registros elegidos arbitrariamente. Los 100 mejores incluirían algún orden para clasificar los registros. –

9
update tb set f1=1 where id in (select top 100 id from tb where f1=0) 
+15

El uso de esta construcción es muy lento ... – Lu4

242

Sin un ORDER BY toda la idea de TOP no tiene mucho sentido. Debe tener una definición coherente de qué dirección está "arriba" y cuál es "abajo" para que el concepto de arriba sea significativo.

No obstante SQL Server permite, pero doesn't guarantee a deterministic result.

La sintaxis UPDATE TOP en la respuesta aceptada no admite una cláusula ORDER BY pero es posible conseguir la semántica deterministas aquí mediante el uso de un CET o tabla derivada para definir el orden de clasificación deseada de la siguiente manera.

;WITH CTE AS 
( 
SELECT TOP 100 * 
FROM T1 
ORDER BY F2 
) 
UPDATE CTE SET F1='foo' 
+16

Motivo del voto a favor? 'TOP' sin' ORDER BY' ** no tiene sentido. Usted acaba de obtener un indefinido '100' filas. –

+0

sentido como en el de no utilizar ningún mundo real – Rohit

+57

Usted dice que carece de sentido, pero eso no es cierto.Reconozco que,/por lo general /, cuando usa las probabilidades 'TOP', debe usarlo con 'ORDER BY' porque lo que le interesa es como el "más" o el "menos" de algo. En otros casos, sin embargo, es posible que solo le interese obtener un registro coincidente. Me gusta hoy! Necesitaba arreglar problemas de datos (ciclos) de a uno por vez. Todo el proceso de reparación implicó un script db, alguna intervención del usuario y algunas operaciones de aplicación. No nos importó QUÉ registro se manejó primero. Nos importó que los estuviéramos manejando uno a la vez. – MetaFight

12

para aquellos como yo todavía pegado con SQL Server 2000, SET ROWCOUNT {number}; se puede utilizar antes de la UPDATE consulta

SET ROWCOUNT 100; 
UPDATE Table SET ..; 
SET ROWCOUNT 0; 

limitará la actualización de 100 filas

Se ha desaprobado por lo menos desde SQL 2005, pero a partir de SQL 2012 todavía funciona. EDIT: se mató en SQL 2014. El uso de SET ROWCOUNT no afectará DELETE, INSERT y UPDATE en SQL Server 2014 y versiones posteriores.

+0

SET ROWCOUNT afecta a los desencadenantes y al comando que se está actualizando. Si tiene el conjunto de eliminación en cascada, puede fallar la transacción si hay más filas que filas de filas secundarias en la tabla secundaria. – EricI

+0

Dicho esto, SET ROWCOUNT @RowCountParameter; es una sintaxis válida, mientras que SELECT TOP @RowCountParamter * FROM TableName no es válido. Si necesita configurar las filas que se actualizan, SET ROWCOUNT # es actualmente la mejor opción, siempre que no tenga habilitadas las tablas secundarias con eliminación en cascada. – EricI

3

Lo que es aún más genial es el hecho de que puede usar una función en línea con valores de tabla para seleccionar cuál (y cuántas a través de TOP) fila (s) actualizar. Es decir:

UPDATE MyTable 
SET [email protected] 
FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3) 

Para la función con valores de tabla que tienen algo interesante para seleccionar la fila para actualizar como:

CREATE FUNCTION tvfSelectLatestRowOfMyTableMatchingCriteria 
(
    @Param1 INT, 
    @Param2 INT, 
    @Param3 INT 
) 
RETURNS TABLE AS RETURN 
(
    SELECT TOP(1) MyTable.* 
    FROM MyTable 
    JOIN MyOtherTable 
     ON ... 
    JOIN WhoKnowsWhatElse 
     ON ... 
    WHERE [email protected] AND ... 
    ORDER BY MyTable.SomeDate DESC 
) 

..., y ahí está (en mi humilde opinión) de la potencia activa de actualizar solo las filas seleccionadas superiores de forma determinista, mientras que al mismo tiempo simplifica la sintaxis de la declaración UPDATE.

Cuestiones relacionadas