2009-08-31 12 views
9

Me gustaría actualizar las 400 filas superiores en una tabla de base de datos. El pseudo SQL está abajo, ¿cómo puedo hacer esto?¿CÓMO ACTUALIZAR TOP 400?

UPDATE top (400) db.dbo.tbl 
SET column1 = 2 
WHERE column2 = 1 
    AND column1 is null 
+0

¿Cuál es la pregunta? – RaYell

+0

Supongo que está utilizando SqlServer. ¿Es esto correcto? También tenga en cuenta la respuesta de HLGEM, no hay garantía de que obtendría el mismo conjunto de resultados cada vez que ejecutara esta consulta a menos que tuviera un pedido. –

+0

retagged, para hacer esto tendría que estar usando SQL Server ya que ningún otro DBMS popular tiene una declaración como TOP 400 – tekiegreg

Respuesta

5

¿Cómo determinarías los mejores 400? Sin orden, no hay garantía de que siempre se seleccione el mismo conjunto y, por lo tanto, se puedan actualizar los registros incorrectos.

9
UPDATE db.dbo.tbl SET column1 = 2 WHERE 
primaryID IN (
    SELECT TOP (400) primarkyID FROM db.dbo.tbl 
    WHERE column2 = 1 AND column1 IS NULL 
) 

Pero no me gusta esto como no hay manera de garantizar que los mejores 400, es posible que desee agregar algún otro tipo de criterios. E incluso una orden por a la subconsulta.

4

Probablemente usted está buscando algo como esto:

update db.dbo.tbl set column1 = 2 
where ID in (
    select top 400 ID from db.dbo.tbl 
    where column2 = 1 and column1 is null --the criteria have been moved here 
    order by ID --order by clause recommended 
) 

donde ID es la columna de clave principal de la tabla.

+0

También puede usar 'set rowcount 400' en lugar de usar' TOP' en la consulta, vea http: // msdn .microsoft.com/es-us/library/ms188774.aspx – pjp

+3

Excepto que SET ROWCOUNT está en desuso. –

+0

@Dave: ¿Estás seguro? No puedo ver eso documentado en los documentos de MSDN http://msdn.microsoft.com/en-us/library/ms188774.aspx – pjp

4

Si está utilizando SQL Server 2008, la sintaxis "n superior" funcionará en las instrucciones de eliminación y actualización. De lo contrario, los otros métodos enumerados aquí donde identifica las claves principales en una subconsulta o tabla derivada funcionarán bien. Y como otros lo han hecho, el "orden por" es muy recomendable o las filas que actualice pueden diferir de una consulta a la siguiente.

+0

También funciona en SQL 2005, pero requiere los corchetes: TOP (n). Ver SQL 2005 BOL, instrucción UPDATE, cláusula TOP(). – Rick

5
WITH q AS 
     (
     SELECT TOP 400 * 
     FROM db.dbo.tb 
     WHERE column2 = 1 
       AND column1 is null 
     ORDER BY 
       column3 -- choose your order! 
     ) 
UPDATE q 
SET  column2 = 2 
+0

@Quassnoi, solo curiosidad, ¿cuál es el beneficio de usar un CTE en lugar de una subselección? –

+1

'@jmgant': no puede actualizar una subselección como en 'Oracle', 'UPDATE (SELECT TOP 400 * ...) SET ...' fallará. Una condición 'IN' propuesta por otros solo resulta en un' JOIN' adicional que es redundante aquí. – Quassnoi

+1

Además, esto funcionará incluso si no tiene una 'PRIMARY KEY' o tiene una' PRIMARY KEY' compuesta (en 'SQL Server', no puede usar más de una columna en un predicado' IN') – Quassnoi

Cuestiones relacionadas