2010-10-05 12 views
25

La query di seguito funziona:SQL query di aggiornamento fila top1

update top(1) ShipBillInfo 
set  shipfirstname='kkk' 
where CustomerId='134'; 

ma sta mostrando errore se cerco di ordinare da alcuni Id: per esempio:

update top(1) ShipBillInfo 
set  shipfirstname='kkk' 
where CustomerId='134' 
order by 
     OredrGUID desc; 
+0

Qualche informazione in più sarebbe simpatico? Informazioni sulla tabella? Dati di esempio? – Tim

risposta

21

Perché non lo fai:

update ShipBillInfo 
set shipfirstname='kkk' 
where OrderGUID = (select top (1) OrderGUID 
        from ShipBillInfo 
        where CustomerId = 134 
        order by OredrGUID desc) 
+0

Ricorda che questo non gestisce la concorrenza, quindi nelle chiamate simultanee può aggiornare la stessa riga due volte – fabriciorissetto

25
With cte as (
select top(1) shipfirtsname 
From ShipBillInfo 
where CustomerId='134' 
order by OredrGUID desc) 
Update cte set shipfirstname='abc'; 
+0

Questo funziona meglio quando si uniscono le tabelle –

+1

Fai attenzione alla concorrenza su questo ... – ErikE

+0

@ErikE Intendevi la molteplicità (1: molte relazioni tra tabelle) o intendevi veramente concorrenza (più di un utente/connessione che cambia la stessa riga allo stesso tempo)? – yzorg

6

Discussione sicuro

Per una soluzione thread-safe nessuna delle soluzioni proposte ha funzionato per me (alcune righe sono state aggiornate più di una volta quando è stata eseguita contemporaneamente allo).

questo ha funzionato:

UPDATE Account 
SET sg_status = 'A' 
WHERE AccountId = 
(
    SELECT TOP 1 AccountId 
    FROM Account WITH (UPDLOCK) --this makes it thread safe 
    ORDER BY CreationDate 
) 

Se si desidera restituire un po 'di colonna della voce aggiornato si può mettere questo nel vostro istruzione di aggiornamento: OUTPUT INSERTED.AccountId (tra il SET e WHERE)

Problemi correlati