2010-10-05 23 views
25

La consulta siguiente está trabajando:SQL actualización de fila TOP1 consulta

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

pero está mostrando el error si trato de ordenar por algunos Id: por ejemplo:

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

Algunos más información sería ¿bonito? ¿Información de la mesa? ¿Data de muestra? – Tim

Respuesta

21

¿Por qué no lo hace:

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

Tenga en cuenta que esto no maneja la simultaneidad, por lo que en llamadas simultáneas puede actualizar la misma fila dos veces – fabriciorissetto

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

Esto funciona mejor al unir tablas –

+1

Tenga cuidado con la concurrencia en este ... – ErikE

+0

@ErikE ¿Quiso decir multiplicidad (1: muchas relaciones de tabla) o ¿realmente quiso decir concurrencia (más de un usuario/conexión cambiando la misma fila al mismo tiempo)? – yzorg

6

hilo de seguridad

Para una solución segura de subprocesos ninguna de las soluciones propuestas funcionó para mí (algunas filas se actualizaron más de una vez cuando se ejecutó al mismo tiempo).

Esto funcionó:

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

Si desea devolver un poco la columna del elemento actualizado se puede poner esto en su instrucción de actualización: OUTPUT INSERTED.AccountId (entre el SET y WHERE)

Cuestiones relacionadas