2009-08-31 11 views
9

Vorrei aggiornare le prime 400 righe in una tabella di database. Lo pseudo SQL è sotto, come posso fare questo?Come AGGIORNARE TOP 400?

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

Qual è la domanda? – RaYell

+0

Suppongo che tu stia utilizzando SqlServer. È corretto? Nota anche la risposta di HLGEM, non vi è alcuna garanzia che si ottenga lo stesso set di risultati ogni volta che si esegue questa query, a meno che non si disponga di un ordine. –

+0

retagged, per fare questo dovresti usare SQL Server come nessun altro popolare DBMS ha una dichiarazione simile a TOP 400 – tekiegreg

risposta

5

Come si determina il 400 superiore? Senza ordine, non c'è garanzia che lo stesso insieme sia sempre selezionato e quindi i record errati potrebbero essere aggiornati.

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 
) 

Ma non mi piace questo come non c'è alcun modo per garantire CHE top 400, si potrebbe desiderare di aggiungere qualche altro tipo di criteri. E persino un ordine dalla subquery.

4

Probabilmente siete alla ricerca di qualcosa di simile:

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 
) 

dove ID è la colonna chiave primaria della tabella.

+0

Puoi anche usare 'imposta rowcount 400' invece di usare' TOP' nella query vedi http: // msdn .microsoft.com/it-it/library/ms188774.aspx – pjp

+3

Tranne che SET ROWCOUNT è deprecato. –

+0

@Dave: sei sicuro? Non riesco a vederlo documentato nei documenti MSDN http://msdn.microsoft.com/en-us/library/ms188774.aspx – pjp

4

Se si utilizza SQL Server 2008, la sintassi "top n" funzionerà con le istruzioni di eliminazione e aggiornamento. In caso contrario, gli altri metodi elencati qui dove si identificano le chiavi primarie in una sottoquery o in una tabella derivata funzioneranno correttamente. E come altri hanno fatto, l'ordine per "è altamente raccomandato o le righe che si aggiornano possono differire da una query alla successiva.

+0

Funziona anche su SQL 2005, ma richiede le parentesi: TOP (n). Vedere SQL 2005 BOL, istruzione UPDATE, clausola 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 curioso, qual è il vantaggio di usare un CTE invece di una sottoselezione? –

+1

'@ jmgant': non è possibile aggiornare una sottoselezione come in' Oracle', 'UPDATE (SELECT TOP 400 * ...) SET ...' fallirà. Una condizione 'IN' proposta da altri risulta in un' JOIN' aggiuntivo che è ridondante qui. – Quassnoi

+1

Inoltre, funzionerà anche se non hai un "PRIMARY KEY" o hai un composito 'PRIMARY KEY' (in' SQL Server', non puoi usare più di una colonna in un predicato 'IN') – Quassnoi